/*
 *
 *    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 <app/util/af-enums.h>
#include <commands/tests/TestCommandBridge.h>
#include <lib/core/Optional.h>
#include <system/SystemClock.h>

#include <math.h> // For INFINITY

typedef void (^ResponseHandler)(id _Nullable value, NSError * _Nullable error);

class TestList : public Command {
public:
    TestList()
        : Command("list") {};
    CHIP_ERROR Run() override
    {
        printf("TestAccessControlCluster\n");
        printf("Test_TC_ACL_1_1\n");
        printf("Test_TC_ACL_2_1\n");
        printf("Test_TC_ACL_2_2\n");
        printf("Test_TC_ACL_2_3\n");
        printf("Test_TC_BOOL_1_1\n");
        printf("Test_TC_BOOL_2_1\n");
        printf("Test_TC_BRBINFO_1_1\n");
        printf("Test_TC_ACT_1_1\n");
        printf("Test_TC_BIND_1_1\n");
        printf("Test_TC_CC_1_1\n");
        printf("Test_TC_CC_2_1\n");
        printf("Test_TC_CC_3_2\n");
        printf("Test_TC_CC_3_3\n");
        printf("Test_TC_CC_4_1\n");
        printf("Test_TC_CC_4_2\n");
        printf("Test_TC_CC_4_3\n");
        printf("Test_TC_CC_4_4\n");
        printf("Test_TC_CC_5_1\n");
        printf("Test_TC_CC_5_2\n");
        printf("Test_TC_CC_5_3\n");
        printf("Test_TC_CC_6_1\n");
        printf("Test_TC_CC_7_3\n");
        printf("Test_TC_CC_7_4\n");
        printf("Test_TC_OPCREDS_1_2\n");
        printf("Test_TC_BINFO_1_1\n");
        printf("Test_TC_CNET_1_3\n");
        printf("Test_TC_DESC_1_1\n");
        printf("Test_TC_DLOG_1_1\n");
        printf("Test_TC_DGETH_1_1\n");
        printf("Test_TC_DGETH_2_1\n");
        printf("Test_TC_DGETH_2_2\n");
        printf("Test_TC_FLW_1_1\n");
        printf("Test_TC_FLW_2_1\n");
        printf("Test_TC_FLABEL_1_1\n");
        printf("Test_TC_CGEN_1_1\n");
        printf("Test_TC_CGEN_2_1\n");
        printf("Test_TC_DGGEN_1_1\n");
        printf("Test_TC_DGGEN_2_1\n");
        printf("Test_TC_I_1_1\n");
        printf("Test_TC_I_2_1\n");
        printf("Test_TC_I_2_2\n");
        printf("Test_TC_I_2_3\n");
        printf("Test_TC_ILL_1_1\n");
        printf("Test_TC_ILL_2_1\n");
        printf("Test_TC_ILL_2_2\n");
        printf("Test_TC_LVL_1_1\n");
        printf("Test_TC_LVL_2_1\n");
        printf("Test_TC_LVL_2_2\n");
        printf("Test_TC_LVL_3_1\n");
        printf("Test_TC_LVL_4_1\n");
        printf("Test_TC_LVL_5_1\n");
        printf("Test_TC_LVL_6_1\n");
        printf("Test_TC_LCFG_1_1\n");
        printf("Test_TC_LUNIT_1_2\n");
        printf("Test_TC_LUNIT_3_1\n");
        printf("Test_TC_LTIME_1_2\n");
        printf("Test_TC_LOWPOWER_1_1\n");
        printf("Test_TC_KEYPADINPUT_1_2\n");
        printf("Test_TC_APPLAUNCHER_1_3\n");
        printf("Test_TC_MEDIAINPUT_1_4\n");
        printf("Test_TC_WAKEONLAN_1_5\n");
        printf("Test_TC_CHANNEL_1_6\n");
        printf("Test_TC_MEDIAPLAYBACK_1_7\n");
        printf("Test_TC_AUDIOOUTPUT_1_8\n");
        printf("Test_TC_TGTNAV_1_9\n");
        printf("Test_TC_TGTNAV_8_2\n");
        printf("Test_TC_APBSC_1_10\n");
        printf("Test_TC_CONTENTLAUNCHER_1_11\n");
        printf("Test_TC_ALOGIN_1_12\n");
        printf("Test_TC_ALOGIN_12_1\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_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_WAKEONLAN_4_1\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_OCC_2_3\n");
        printf("Test_TC_OO_1_1\n");
        printf("Test_TC_OO_2_1\n");
        printf("Test_TC_OO_2_2\n");
        printf("Test_TC_OO_2_4\n");
        printf("Test_TC_PS_1_1\n");
        printf("Test_TC_PS_2_1\n");
        printf("Test_TC_PRS_1_1\n");
        printf("Test_TC_PRS_2_1\n");
        printf("Test_TC_PRS_2_2\n");
        printf("Test_TC_PCC_1_1\n");
        printf("Test_TC_PCC_2_1\n");
        printf("Test_TC_PCC_2_2\n");
        printf("Test_TC_PCC_2_3\n");
        printf("Test_TC_PCC_2_4\n");
        printf("Test_TC_PSCFG_1_1\n");
        printf("Test_TC_PSCFG_2_1\n");
        printf("Test_TC_RH_1_1\n");
        printf("Test_TC_RH_2_1\n");
        printf("Test_TC_SWTCH_1_1\n");
        printf("Test_TC_TMP_1_1\n");
        printf("Test_TC_TMP_2_1\n");
        printf("Test_TC_TSTAT_1_1\n");
        printf("Test_TC_TSUIC_1_1\n");
        printf("Test_TC_TSUIC_2_1\n");
        printf("Test_TC_TSUIC_2_2\n");
        printf("Test_TC_DGTHREAD_1_1\n");
        printf("Test_TC_ULABEL_1_1\n");
        printf("Test_TC_ULABEL_2_1\n");
        printf("Test_TC_ULABEL_2_2\n");
        printf("Test_TC_ULABEL_2_3\n");
        printf("Test_TC_ULABEL_2_4\n");
        printf("Test_TC_DGWIFI_1_1\n");
        printf("Test_TC_DGWIFI_2_1\n");
        printf("Test_TC_DGWIFI_2_3\n");
        printf("Test_TC_WNCV_1_1\n");
        printf("Test_TC_WNCV_2_1\n");
        printf("Test_TC_WNCV_2_2\n");
        printf("Test_TC_WNCV_2_3\n");
        printf("Test_TC_WNCV_2_4\n");
        printf("Test_TC_WNCV_2_5\n");
        printf("Test_TC_WNCV_3_1\n");
        printf("Test_TC_WNCV_3_2\n");
        printf("Test_TC_WNCV_3_3\n");
        printf("Test_TC_WNCV_3_4\n");
        printf("Test_TC_WNCV_3_5\n");
        printf("Test_TC_WNCV_4_1\n");
        printf("Test_TC_WNCV_4_2\n");
        printf("Test_TC_WNCV_4_3\n");
        printf("Test_TC_WNCV_4_4\n");
        printf("Test_TC_WNCV_4_5\n");
        printf("TV_TargetNavigatorCluster\n");
        printf("TV_AudioOutputCluster\n");
        printf("TV_ApplicationLauncherCluster\n");
        printf("TV_KeypadInputCluster\n");
        printf("TV_AccountLoginCluster\n");
        printf("TV_WakeOnLanCluster\n");
        printf("TV_ApplicationBasicCluster\n");
        printf("TV_MediaPlaybackCluster\n");
        printf("TV_ChannelCluster\n");
        printf("TV_LowPowerCluster\n");
        printf("TV_ContentLauncherCluster\n");
        printf("TV_MediaInputCluster\n");
        printf("TestCASERecovery\n");
        printf("TestCluster\n");
        printf("TestConstraints\n");
        printf("TestDelayCommands\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("TestCommissionerNodeId\n");
        printf("TestMultiAdmin\n");
        printf("Test_TC_DGSW_1_1\n");
        printf("TestSubscribe_OnOff\n");
        printf("TestSubscribe_AdministratorCommissioning\n");
        printf("DL_UsersAndCredentials\n");
        printf("DL_LockUnlock\n");
        printf("DL_Schedules\n");
        printf("Test_TC_DRLK_1_1\n");
        printf("Test_TC_DRLK_2_2\n");
        printf("Test_TC_DRLK_2_3\n");
        printf("Test_TC_DRLK_2_4\n");
        printf("Test_TC_DRLK_2_5\n");
        printf("Test_TC_DRLK_2_6\n");
        printf("Test_TC_DRLK_2_7\n");
        printf("Test_TC_DRLK_2_9\n");
        printf("TestGroupsCluster\n");
        printf("TestGroupKeyManagementCluster\n");
        printf("Test_TC_G_1_1\n");

        return CHIP_NO_ERROR;
    }
};

class ManualTestList : public Command {
public:
    ManualTestList()
        : Command("list-manual") {};
    CHIP_ERROR Run() override { return CHIP_NO_ERROR; }
};

class TestAccessControlCluster : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestAccessControlCluster()
        : TestCommandBridge("TestAccessControlCluster")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestAccessControlCluster() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestAccessControlCluster\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestAccessControlCluster\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for commissionee\n");
            err = TestWaitForCommissionee_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Write entries\n");
            err = TestWriteEntries_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Verify\n");
            err = TestVerify_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Write entries empty lists\n");
            err = TestWriteEntriesEmptyLists_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Verify\n");
            err = TestVerify_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Write entry invalid privilege\n");
            err = TestWriteEntryInvalidPrivilege_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Verify\n");
            err = TestVerify_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Write entry invalid auth mode\n");
            err = TestWriteEntryInvalidAuthMode_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Verify\n");
            err = TestVerify_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Write entry invalid subject\n");
            err = TestWriteEntryInvalidSubject_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Verify\n");
            err = TestVerify_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Write entry invalid target\n");
            err = TestWriteEntryInvalidTarget_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Verify\n");
            err = TestVerify_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Write entry too many subjects\n");
            err = TestWriteEntryTooManySubjects_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Verify\n");
            err = TestVerify_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Write entry too many targets\n");
            err = TestWriteEntryTooManyTargets_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Verify\n");
            err = TestVerify_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Write too many entries\n");
            err = TestWriteTooManyEntries_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Verify\n");
            err = TestVerify_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Restore ACL\n");
            err = TestRestoreAcl_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Verify\n");
            err = TestVerify_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Validate resource minima (SubjectsPerAccessControlEntry)\n");
            err = TestValidateResourceMinimaSubjectsPerAccessControlEntry_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : Validate resource minima (TargetsPerAccessControlEntry)\n");
            err = TestValidateResourceMinimaTargetsPerAccessControlEntry_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : Validate resource minima (AccessControlEntriesPerFabric)\n");
            err = TestValidateResourceMinimaAccessControlEntriesPerFabric_23();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            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_CONSTRAINT_ERROR));
            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));
            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_RESOURCE_EXHAUSTED));
            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));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 24;

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

    CHIP_ERROR TestWaitForCommissionee_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestWriteEntries_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id aclArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).subjects = nil;
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[0]).cluster = nil;
                ((MTRAccessControlClusterTarget *) temp_3[0]).endpoint = [NSNumber numberWithUnsignedShort:0U];
                ((MTRAccessControlClusterTarget *) temp_3[0]).deviceType = nil;

                temp_3[1] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[1]).cluster = [NSNumber numberWithUnsignedInt:1UL];
                ((MTRAccessControlClusterTarget *) temp_3[1]).endpoint = nil;
                ((MTRAccessControlClusterTarget *) temp_3[1]).deviceType = nil;

                temp_3[2] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[2]).cluster = [NSNumber numberWithUnsignedInt:2UL];
                ((MTRAccessControlClusterTarget *) temp_3[2]).endpoint = [NSNumber numberWithUnsignedShort:3U];
                ((MTRAccessControlClusterTarget *) temp_3[2]).deviceType = nil;

                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).targets = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:0U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:1U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:4ULL];
                temp_3[1] = [NSNumber numberWithUnsignedLongLong:5ULL];
                temp_3[2] = [NSNumber numberWithUnsignedLongLong:6ULL];
                temp_3[3] = [NSNumber numberWithUnsignedLongLong:7ULL];
                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).subjects = temp_3;
            }
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[0]).cluster = nil;
                ((MTRAccessControlClusterTarget *) temp_3[0]).endpoint = [NSNumber numberWithUnsignedShort:8U];
                ((MTRAccessControlClusterTarget *) temp_3[0]).deviceType = nil;

                temp_3[1] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[1]).cluster = [NSNumber numberWithUnsignedInt:9UL];
                ((MTRAccessControlClusterTarget *) temp_3[1]).endpoint = nil;
                ((MTRAccessControlClusterTarget *) temp_3[1]).deviceType = nil;

                temp_3[2] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[2]).cluster = [NSNumber numberWithUnsignedInt:10UL];
                ((MTRAccessControlClusterTarget *) temp_3[2]).endpoint = [NSNumber numberWithUnsignedShort:11U];
                ((MTRAccessControlClusterTarget *) temp_3[2]).deviceType = nil;

                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).targets = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).fabricIndex = [NSNumber numberWithUnsignedChar:0U];

            temp_0[2] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[2]).privilege = [NSNumber numberWithUnsignedChar:3U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[2]).authMode = [NSNumber numberWithUnsignedChar:3U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:12ULL];
                temp_3[1] = [NSNumber numberWithUnsignedLongLong:13ULL];
                temp_3[2] = [NSNumber numberWithUnsignedLongLong:14ULL];
                temp_3[3] = [NSNumber numberWithUnsignedLongLong:15ULL];
                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[2]).subjects = temp_3;
            }
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[0]).cluster = nil;
                ((MTRAccessControlClusterTarget *) temp_3[0]).endpoint = [NSNumber numberWithUnsignedShort:16U];
                ((MTRAccessControlClusterTarget *) temp_3[0]).deviceType = nil;

                temp_3[1] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[1]).cluster = [NSNumber numberWithUnsignedInt:17UL];
                ((MTRAccessControlClusterTarget *) temp_3[1]).endpoint = nil;
                ((MTRAccessControlClusterTarget *) temp_3[1]).deviceType = nil;

                temp_3[2] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[2]).cluster = [NSNumber numberWithUnsignedInt:18UL];
                ((MTRAccessControlClusterTarget *) temp_3[2]).endpoint = [NSNumber numberWithUnsignedShort:19U];
                ((MTRAccessControlClusterTarget *) temp_3[2]).deviceType = nil;

                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[2]).targets = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[2]).fabricIndex = [NSNumber numberWithUnsignedChar:0U];

            temp_0[3] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[3]).privilege = [NSNumber numberWithUnsignedChar:3U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[3]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:20ULL];
                temp_3[1] = [NSNumber numberWithUnsignedLongLong:21ULL];
                temp_3[2] = [NSNumber numberWithUnsignedLongLong:22ULL];
                temp_3[3] = [NSNumber numberWithUnsignedLongLong:23ULL];
                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[3]).subjects = temp_3;
            }
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[0]).cluster = nil;
                ((MTRAccessControlClusterTarget *) temp_3[0]).endpoint = [NSNumber numberWithUnsignedShort:24U];
                ((MTRAccessControlClusterTarget *) temp_3[0]).deviceType = nil;

                temp_3[1] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[1]).cluster = [NSNumber numberWithUnsignedInt:25UL];
                ((MTRAccessControlClusterTarget *) temp_3[1]).endpoint = nil;
                ((MTRAccessControlClusterTarget *) temp_3[1]).deviceType = nil;

                temp_3[2] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[2]).cluster = [NSNumber numberWithUnsignedInt:26UL];
                ((MTRAccessControlClusterTarget *) temp_3[2]).endpoint = [NSNumber numberWithUnsignedShort:27U];
                ((MTRAccessControlClusterTarget *) temp_3[2]).deviceType = nil;

                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[3]).targets = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[3]).fabricIndex = [NSNumber numberWithUnsignedChar:0U];

            aclArgument = temp_0;
        }
        [cluster writeAttributeACLWithValue:aclArgument
                                 completion:^(NSError * _Nullable err) {
                                     NSLog(@"Write entries Error: %@", err);

                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerify_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRReadParams alloc] init];
        params.filterByFabric = true;
        [cluster
            readAttributeACLWithParams:params
                            completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                NSLog(@"Verify Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                {
                                    id actualValue = value;
                                    VerifyOrReturn(CheckValue("ACL", [actualValue count], static_cast<uint32_t>(4)));
                                    VerifyOrReturn(CheckValue("Privilege",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).privilege, 5U));
                                    VerifyOrReturn(CheckValue("AuthMode",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).authMode, 2U));
                                    VerifyOrReturn(CheckValueNull(
                                        "Subjects", ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).subjects));
                                    VerifyOrReturn(CheckValueNonNull(
                                        "Targets", ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).targets));
                                    VerifyOrReturn(CheckValue("Targets",
                                        [((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).targets count],
                                        static_cast<uint32_t>(3)));
                                    VerifyOrReturn(CheckValueNull("Cluster",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[0])
                                                .targets[0])
                                            .cluster));
                                    VerifyOrReturn(CheckValueNonNull("Endpoint",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[0])
                                                .targets[0])
                                            .endpoint));
                                    VerifyOrReturn(CheckValue("Endpoint",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[0])
                                                .targets[0])
                                            .endpoint,
                                        0U));
                                    VerifyOrReturn(CheckValueNull("DeviceType",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[0])
                                                .targets[0])
                                            .deviceType));
                                    VerifyOrReturn(CheckValueNonNull("Cluster",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[0])
                                                .targets[1])
                                            .cluster));
                                    VerifyOrReturn(CheckValue("Cluster",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[0])
                                                .targets[1])
                                            .cluster,
                                        1UL));
                                    VerifyOrReturn(CheckValueNull("Endpoint",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[0])
                                                .targets[1])
                                            .endpoint));
                                    VerifyOrReturn(CheckValueNull("DeviceType",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[0])
                                                .targets[1])
                                            .deviceType));
                                    VerifyOrReturn(CheckValueNonNull("Cluster",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[0])
                                                .targets[2])
                                            .cluster));
                                    VerifyOrReturn(CheckValue("Cluster",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[0])
                                                .targets[2])
                                            .cluster,
                                        2UL));
                                    VerifyOrReturn(CheckValueNonNull("Endpoint",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[0])
                                                .targets[2])
                                            .endpoint));
                                    VerifyOrReturn(CheckValue("Endpoint",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[0])
                                                .targets[2])
                                            .endpoint,
                                        3U));
                                    VerifyOrReturn(CheckValueNull("DeviceType",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[0])
                                                .targets[2])
                                            .deviceType));
                                    VerifyOrReturn(CheckValue("FabricIndex",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).fabricIndex, 1U));
                                    VerifyOrReturn(CheckValue("Privilege",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[1]).privilege, 1U));
                                    VerifyOrReturn(CheckValue("AuthMode",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[1]).authMode, 2U));
                                    VerifyOrReturn(CheckValueNonNull(
                                        "Subjects", ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[1]).subjects));
                                    VerifyOrReturn(CheckValue("Subjects",
                                        [((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[1]).subjects count],
                                        static_cast<uint32_t>(4)));
                                    VerifyOrReturn(CheckValue("",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[1]).subjects[0], 4ULL));
                                    VerifyOrReturn(CheckValue("",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[1]).subjects[1], 5ULL));
                                    VerifyOrReturn(CheckValue("",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[1]).subjects[2], 6ULL));
                                    VerifyOrReturn(CheckValue("",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[1]).subjects[3], 7ULL));
                                    VerifyOrReturn(CheckValueNonNull(
                                        "Targets", ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[1]).targets));
                                    VerifyOrReturn(CheckValue("Targets",
                                        [((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[1]).targets count],
                                        static_cast<uint32_t>(3)));
                                    VerifyOrReturn(CheckValueNull("Cluster",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[1])
                                                .targets[0])
                                            .cluster));
                                    VerifyOrReturn(CheckValueNonNull("Endpoint",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[1])
                                                .targets[0])
                                            .endpoint));
                                    VerifyOrReturn(CheckValue("Endpoint",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[1])
                                                .targets[0])
                                            .endpoint,
                                        8U));
                                    VerifyOrReturn(CheckValueNull("DeviceType",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[1])
                                                .targets[0])
                                            .deviceType));
                                    VerifyOrReturn(CheckValueNonNull("Cluster",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[1])
                                                .targets[1])
                                            .cluster));
                                    VerifyOrReturn(CheckValue("Cluster",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[1])
                                                .targets[1])
                                            .cluster,
                                        9UL));
                                    VerifyOrReturn(CheckValueNull("Endpoint",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[1])
                                                .targets[1])
                                            .endpoint));
                                    VerifyOrReturn(CheckValueNull("DeviceType",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[1])
                                                .targets[1])
                                            .deviceType));
                                    VerifyOrReturn(CheckValueNonNull("Cluster",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[1])
                                                .targets[2])
                                            .cluster));
                                    VerifyOrReturn(CheckValue("Cluster",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[1])
                                                .targets[2])
                                            .cluster,
                                        10UL));
                                    VerifyOrReturn(CheckValueNonNull("Endpoint",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[1])
                                                .targets[2])
                                            .endpoint));
                                    VerifyOrReturn(CheckValue("Endpoint",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[1])
                                                .targets[2])
                                            .endpoint,
                                        11U));
                                    VerifyOrReturn(CheckValueNull("DeviceType",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[1])
                                                .targets[2])
                                            .deviceType));
                                    VerifyOrReturn(CheckValue("FabricIndex",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[1]).fabricIndex, 1U));
                                    VerifyOrReturn(CheckValue("Privilege",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[2]).privilege, 3U));
                                    VerifyOrReturn(CheckValue("AuthMode",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[2]).authMode, 3U));
                                    VerifyOrReturn(CheckValueNonNull(
                                        "Subjects", ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[2]).subjects));
                                    VerifyOrReturn(CheckValue("Subjects",
                                        [((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[2]).subjects count],
                                        static_cast<uint32_t>(4)));
                                    VerifyOrReturn(CheckValue("",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[2]).subjects[0], 12ULL));
                                    VerifyOrReturn(CheckValue("",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[2]).subjects[1], 13ULL));
                                    VerifyOrReturn(CheckValue("",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[2]).subjects[2], 14ULL));
                                    VerifyOrReturn(CheckValue("",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[2]).subjects[3], 15ULL));
                                    VerifyOrReturn(CheckValueNonNull(
                                        "Targets", ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[2]).targets));
                                    VerifyOrReturn(CheckValue("Targets",
                                        [((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[2]).targets count],
                                        static_cast<uint32_t>(3)));
                                    VerifyOrReturn(CheckValueNull("Cluster",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[2])
                                                .targets[0])
                                            .cluster));
                                    VerifyOrReturn(CheckValueNonNull("Endpoint",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[2])
                                                .targets[0])
                                            .endpoint));
                                    VerifyOrReturn(CheckValue("Endpoint",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[2])
                                                .targets[0])
                                            .endpoint,
                                        16U));
                                    VerifyOrReturn(CheckValueNull("DeviceType",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[2])
                                                .targets[0])
                                            .deviceType));
                                    VerifyOrReturn(CheckValueNonNull("Cluster",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[2])
                                                .targets[1])
                                            .cluster));
                                    VerifyOrReturn(CheckValue("Cluster",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[2])
                                                .targets[1])
                                            .cluster,
                                        17UL));
                                    VerifyOrReturn(CheckValueNull("Endpoint",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[2])
                                                .targets[1])
                                            .endpoint));
                                    VerifyOrReturn(CheckValueNull("DeviceType",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[2])
                                                .targets[1])
                                            .deviceType));
                                    VerifyOrReturn(CheckValueNonNull("Cluster",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[2])
                                                .targets[2])
                                            .cluster));
                                    VerifyOrReturn(CheckValue("Cluster",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[2])
                                                .targets[2])
                                            .cluster,
                                        18UL));
                                    VerifyOrReturn(CheckValueNonNull("Endpoint",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[2])
                                                .targets[2])
                                            .endpoint));
                                    VerifyOrReturn(CheckValue("Endpoint",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[2])
                                                .targets[2])
                                            .endpoint,
                                        19U));
                                    VerifyOrReturn(CheckValueNull("DeviceType",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[2])
                                                .targets[2])
                                            .deviceType));
                                    VerifyOrReturn(CheckValue("FabricIndex",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[2]).fabricIndex, 1U));
                                    VerifyOrReturn(CheckValue("Privilege",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[3]).privilege, 3U));
                                    VerifyOrReturn(CheckValue("AuthMode",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[3]).authMode, 2U));
                                    VerifyOrReturn(CheckValueNonNull(
                                        "Subjects", ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[3]).subjects));
                                    VerifyOrReturn(CheckValue("Subjects",
                                        [((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[3]).subjects count],
                                        static_cast<uint32_t>(4)));
                                    VerifyOrReturn(CheckValue("",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[3]).subjects[0], 20ULL));
                                    VerifyOrReturn(CheckValue("",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[3]).subjects[1], 21ULL));
                                    VerifyOrReturn(CheckValue("",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[3]).subjects[2], 22ULL));
                                    VerifyOrReturn(CheckValue("",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[3]).subjects[3], 23ULL));
                                    VerifyOrReturn(CheckValueNonNull(
                                        "Targets", ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[3]).targets));
                                    VerifyOrReturn(CheckValue("Targets",
                                        [((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[3]).targets count],
                                        static_cast<uint32_t>(3)));
                                    VerifyOrReturn(CheckValueNull("Cluster",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[3])
                                                .targets[0])
                                            .cluster));
                                    VerifyOrReturn(CheckValueNonNull("Endpoint",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[3])
                                                .targets[0])
                                            .endpoint));
                                    VerifyOrReturn(CheckValue("Endpoint",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[3])
                                                .targets[0])
                                            .endpoint,
                                        24U));
                                    VerifyOrReturn(CheckValueNull("DeviceType",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[3])
                                                .targets[0])
                                            .deviceType));
                                    VerifyOrReturn(CheckValueNonNull("Cluster",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[3])
                                                .targets[1])
                                            .cluster));
                                    VerifyOrReturn(CheckValue("Cluster",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[3])
                                                .targets[1])
                                            .cluster,
                                        25UL));
                                    VerifyOrReturn(CheckValueNull("Endpoint",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[3])
                                                .targets[1])
                                            .endpoint));
                                    VerifyOrReturn(CheckValueNull("DeviceType",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[3])
                                                .targets[1])
                                            .deviceType));
                                    VerifyOrReturn(CheckValueNonNull("Cluster",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[3])
                                                .targets[2])
                                            .cluster));
                                    VerifyOrReturn(CheckValue("Cluster",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[3])
                                                .targets[2])
                                            .cluster,
                                        26UL));
                                    VerifyOrReturn(CheckValueNonNull("Endpoint",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[3])
                                                .targets[2])
                                            .endpoint));
                                    VerifyOrReturn(CheckValue("Endpoint",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[3])
                                                .targets[2])
                                            .endpoint,
                                        27U));
                                    VerifyOrReturn(CheckValueNull("DeviceType",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[3])
                                                .targets[2])
                                            .deviceType));
                                    VerifyOrReturn(CheckValue("FabricIndex",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[3]).fabricIndex, 1U));
                                }

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteEntriesEmptyLists_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id aclArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).subjects = nil;
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:0U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:1U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).subjects = temp_3;
            }
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).targets = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).fabricIndex = [NSNumber numberWithUnsignedChar:0U];

            aclArgument = temp_0;
        }
        [cluster writeAttributeACLWithValue:aclArgument
                                 completion:^(NSError * _Nullable err) {
                                     NSLog(@"Write entries empty lists Error: %@", err);

                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerify_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRReadParams alloc] init];
        params.filterByFabric = true;
        [cluster readAttributeACLWithParams:params
                                 completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                     NSLog(@"Verify Error: %@", err);

                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                     {
                                         id actualValue = value;
                                         VerifyOrReturn(CheckValue("ACL", [actualValue count], static_cast<uint32_t>(2)));
                                         VerifyOrReturn(CheckValue("Privilege",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).privilege, 5U));
                                         VerifyOrReturn(CheckValue("AuthMode",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).authMode, 2U));
                                         VerifyOrReturn(CheckValueNull("Subjects",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).subjects));
                                         VerifyOrReturn(CheckValueNull("Targets",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).targets));
                                         VerifyOrReturn(CheckValue("FabricIndex",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).fabricIndex, 1U));
                                         VerifyOrReturn(CheckValue("Privilege",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[1]).privilege, 1U));
                                         VerifyOrReturn(CheckValue("AuthMode",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[1]).authMode, 2U));
                                         VerifyOrReturn(CheckValueNull("Subjects",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[1]).subjects));
                                         VerifyOrReturn(CheckValueNull("Targets",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[1]).targets));
                                         VerifyOrReturn(CheckValue("FabricIndex",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[1]).fabricIndex, 1U));
                                     }

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteEntryInvalidPrivilege_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id aclArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).subjects = nil;
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:0U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:3U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).subjects = nil;
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).fabricIndex = [NSNumber numberWithUnsignedChar:0U];

            aclArgument = temp_0;
        }
        [cluster writeAttributeACLWithValue:aclArgument
                                 completion:^(NSError * _Nullable err) {
                                     NSLog(@"Write entry invalid privilege Error: %@", err);

                                     VerifyOrReturn(CheckValue("status",
                                         err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                       : EMBER_ZCL_STATUS_FAILURE)
                                             : 0,
                                         EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerify_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRReadParams alloc] init];
        params.filterByFabric = true;
        [cluster readAttributeACLWithParams:params
                                 completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                     NSLog(@"Verify Error: %@", err);

                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                     {
                                         id actualValue = value;
                                         VerifyOrReturn(CheckValue("ACL", [actualValue count], static_cast<uint32_t>(1)));
                                         VerifyOrReturn(CheckValue("Privilege",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).privilege, 5U));
                                         VerifyOrReturn(CheckValue("AuthMode",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).authMode, 2U));
                                         VerifyOrReturn(CheckValueNull("Subjects",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).subjects));
                                         VerifyOrReturn(CheckValueNull("Targets",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).targets));
                                         VerifyOrReturn(CheckValue("FabricIndex",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).fabricIndex, 1U));
                                     }

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteEntryInvalidAuthMode_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id aclArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).subjects = nil;
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:0U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:1U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:1U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).subjects = nil;
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).fabricIndex = [NSNumber numberWithUnsignedChar:0U];

            aclArgument = temp_0;
        }
        [cluster writeAttributeACLWithValue:aclArgument
                                 completion:^(NSError * _Nullable err) {
                                     NSLog(@"Write entry invalid auth mode Error: %@", err);

                                     VerifyOrReturn(CheckValue("status",
                                         err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                       : EMBER_ZCL_STATUS_FAILURE)
                                             : 0,
                                         EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerify_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRReadParams alloc] init];
        params.filterByFabric = true;
        [cluster readAttributeACLWithParams:params
                                 completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                     NSLog(@"Verify Error: %@", err);

                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                     {
                                         id actualValue = value;
                                         VerifyOrReturn(CheckValue("ACL", [actualValue count], static_cast<uint32_t>(1)));
                                         VerifyOrReturn(CheckValue("Privilege",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).privilege, 5U));
                                         VerifyOrReturn(CheckValue("AuthMode",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).authMode, 2U));
                                         VerifyOrReturn(CheckValueNull("Subjects",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).subjects));
                                         VerifyOrReturn(CheckValueNull("Targets",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).targets));
                                         VerifyOrReturn(CheckValue("FabricIndex",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).fabricIndex, 1U));
                                     }

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteEntryInvalidSubject_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id aclArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).subjects = nil;
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:0U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:1U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:0ULL];
                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).fabricIndex = [NSNumber numberWithUnsignedChar:0U];

            aclArgument = temp_0;
        }
        [cluster writeAttributeACLWithValue:aclArgument
                                 completion:^(NSError * _Nullable err) {
                                     NSLog(@"Write entry invalid subject Error: %@", err);

                                     VerifyOrReturn(CheckValue("status",
                                         err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                       : EMBER_ZCL_STATUS_FAILURE)
                                             : 0,
                                         EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerify_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRReadParams alloc] init];
        params.filterByFabric = true;
        [cluster readAttributeACLWithParams:params
                                 completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                     NSLog(@"Verify Error: %@", err);

                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                     {
                                         id actualValue = value;
                                         VerifyOrReturn(CheckValue("ACL", [actualValue count], static_cast<uint32_t>(1)));
                                         VerifyOrReturn(CheckValue("Privilege",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).privilege, 5U));
                                         VerifyOrReturn(CheckValue("AuthMode",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).authMode, 2U));
                                         VerifyOrReturn(CheckValueNull("Subjects",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).subjects));
                                         VerifyOrReturn(CheckValueNull("Targets",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).targets));
                                         VerifyOrReturn(CheckValue("FabricIndex",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).fabricIndex, 1U));
                                     }

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteEntryInvalidTarget_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id aclArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).subjects = nil;
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:0U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:1U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:2U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).subjects = nil;
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[0]).cluster = nil;
                ((MTRAccessControlClusterTarget *) temp_3[0]).endpoint = nil;
                ((MTRAccessControlClusterTarget *) temp_3[0]).deviceType = nil;

                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).targets = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).fabricIndex = [NSNumber numberWithUnsignedChar:0U];

            aclArgument = temp_0;
        }
        [cluster writeAttributeACLWithValue:aclArgument
                                 completion:^(NSError * _Nullable err) {
                                     NSLog(@"Write entry invalid target Error: %@", err);

                                     VerifyOrReturn(CheckValue("status",
                                         err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                       : EMBER_ZCL_STATUS_FAILURE)
                                             : 0,
                                         EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerify_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRReadParams alloc] init];
        params.filterByFabric = true;
        [cluster readAttributeACLWithParams:params
                                 completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                     NSLog(@"Verify Error: %@", err);

                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                     {
                                         id actualValue = value;
                                         VerifyOrReturn(CheckValue("ACL", [actualValue count], static_cast<uint32_t>(1)));
                                         VerifyOrReturn(CheckValue("Privilege",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).privilege, 5U));
                                         VerifyOrReturn(CheckValue("AuthMode",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).authMode, 2U));
                                         VerifyOrReturn(CheckValueNull("Subjects",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).subjects));
                                         VerifyOrReturn(CheckValueNull("Targets",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).targets));
                                         VerifyOrReturn(CheckValue("FabricIndex",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).fabricIndex, 1U));
                                     }

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteEntryTooManySubjects_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id aclArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).subjects = nil;
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:0U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:1U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:1ULL];
                temp_3[1] = [NSNumber numberWithUnsignedLongLong:2ULL];
                temp_3[2] = [NSNumber numberWithUnsignedLongLong:3ULL];
                temp_3[3] = [NSNumber numberWithUnsignedLongLong:4ULL];
                temp_3[4] = [NSNumber numberWithUnsignedLongLong:5ULL];
                temp_3[5] = [NSNumber numberWithUnsignedLongLong:6ULL];
                temp_3[6] = [NSNumber numberWithUnsignedLongLong:7ULL];
                temp_3[7] = [NSNumber numberWithUnsignedLongLong:8ULL];
                temp_3[8] = [NSNumber numberWithUnsignedLongLong:9ULL];
                temp_3[9] = [NSNumber numberWithUnsignedLongLong:10ULL];
                temp_3[10] = [NSNumber numberWithUnsignedLongLong:11ULL];
                temp_3[11] = [NSNumber numberWithUnsignedLongLong:12ULL];
                temp_3[12] = [NSNumber numberWithUnsignedLongLong:13ULL];
                temp_3[13] = [NSNumber numberWithUnsignedLongLong:14ULL];
                temp_3[14] = [NSNumber numberWithUnsignedLongLong:15ULL];
                temp_3[15] = [NSNumber numberWithUnsignedLongLong:16ULL];
                temp_3[16] = [NSNumber numberWithUnsignedLongLong:17ULL];
                temp_3[17] = [NSNumber numberWithUnsignedLongLong:18ULL];
                temp_3[18] = [NSNumber numberWithUnsignedLongLong:19ULL];
                temp_3[19] = [NSNumber numberWithUnsignedLongLong:20ULL];
                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).fabricIndex = [NSNumber numberWithUnsignedChar:0U];

            aclArgument = temp_0;
        }
        [cluster writeAttributeACLWithValue:aclArgument
                                 completion:^(NSError * _Nullable err) {
                                     NSLog(@"Write entry too many subjects Error: %@", err);

                                     VerifyOrReturn(CheckValue("status",
                                         err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                       : EMBER_ZCL_STATUS_FAILURE)
                                             : 0,
                                         EMBER_ZCL_STATUS_FAILURE));
                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerify_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRReadParams alloc] init];
        params.filterByFabric = true;
        [cluster readAttributeACLWithParams:params
                                 completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                     NSLog(@"Verify Error: %@", err);

                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                     {
                                         id actualValue = value;
                                         VerifyOrReturn(CheckValue("ACL", [actualValue count], static_cast<uint32_t>(1)));
                                         VerifyOrReturn(CheckValue("Privilege",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).privilege, 5U));
                                         VerifyOrReturn(CheckValue("AuthMode",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).authMode, 2U));
                                         VerifyOrReturn(CheckValueNull("Subjects",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).subjects));
                                         VerifyOrReturn(CheckValueNull("Targets",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).targets));
                                         VerifyOrReturn(CheckValue("FabricIndex",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).fabricIndex, 1U));
                                     }

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteEntryTooManyTargets_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id aclArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).subjects = nil;
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:0U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:1U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:2U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).subjects = nil;
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[0]).cluster = nil;
                ((MTRAccessControlClusterTarget *) temp_3[0]).endpoint = [NSNumber numberWithUnsignedShort:1U];
                ((MTRAccessControlClusterTarget *) temp_3[0]).deviceType = nil;

                temp_3[1] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[1]).cluster = nil;
                ((MTRAccessControlClusterTarget *) temp_3[1]).endpoint = [NSNumber numberWithUnsignedShort:2U];
                ((MTRAccessControlClusterTarget *) temp_3[1]).deviceType = nil;

                temp_3[2] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[2]).cluster = nil;
                ((MTRAccessControlClusterTarget *) temp_3[2]).endpoint = [NSNumber numberWithUnsignedShort:3U];
                ((MTRAccessControlClusterTarget *) temp_3[2]).deviceType = nil;

                temp_3[3] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[3]).cluster = nil;
                ((MTRAccessControlClusterTarget *) temp_3[3]).endpoint = [NSNumber numberWithUnsignedShort:4U];
                ((MTRAccessControlClusterTarget *) temp_3[3]).deviceType = nil;

                temp_3[4] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[4]).cluster = nil;
                ((MTRAccessControlClusterTarget *) temp_3[4]).endpoint = [NSNumber numberWithUnsignedShort:5U];
                ((MTRAccessControlClusterTarget *) temp_3[4]).deviceType = nil;

                temp_3[5] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[5]).cluster = nil;
                ((MTRAccessControlClusterTarget *) temp_3[5]).endpoint = [NSNumber numberWithUnsignedShort:6U];
                ((MTRAccessControlClusterTarget *) temp_3[5]).deviceType = nil;

                temp_3[6] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[6]).cluster = nil;
                ((MTRAccessControlClusterTarget *) temp_3[6]).endpoint = [NSNumber numberWithUnsignedShort:7U];
                ((MTRAccessControlClusterTarget *) temp_3[6]).deviceType = nil;

                temp_3[7] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[7]).cluster = nil;
                ((MTRAccessControlClusterTarget *) temp_3[7]).endpoint = [NSNumber numberWithUnsignedShort:8U];
                ((MTRAccessControlClusterTarget *) temp_3[7]).deviceType = nil;

                temp_3[8] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[8]).cluster = nil;
                ((MTRAccessControlClusterTarget *) temp_3[8]).endpoint = [NSNumber numberWithUnsignedShort:9U];
                ((MTRAccessControlClusterTarget *) temp_3[8]).deviceType = nil;

                temp_3[9] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[9]).cluster = nil;
                ((MTRAccessControlClusterTarget *) temp_3[9]).endpoint = [NSNumber numberWithUnsignedShort:10U];
                ((MTRAccessControlClusterTarget *) temp_3[9]).deviceType = nil;

                temp_3[10] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[10]).cluster = nil;
                ((MTRAccessControlClusterTarget *) temp_3[10]).endpoint = [NSNumber numberWithUnsignedShort:11U];
                ((MTRAccessControlClusterTarget *) temp_3[10]).deviceType = nil;

                temp_3[11] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[11]).cluster = nil;
                ((MTRAccessControlClusterTarget *) temp_3[11]).endpoint = [NSNumber numberWithUnsignedShort:12U];
                ((MTRAccessControlClusterTarget *) temp_3[11]).deviceType = nil;

                temp_3[12] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[12]).cluster = nil;
                ((MTRAccessControlClusterTarget *) temp_3[12]).endpoint = [NSNumber numberWithUnsignedShort:13U];
                ((MTRAccessControlClusterTarget *) temp_3[12]).deviceType = nil;

                temp_3[13] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[13]).cluster = nil;
                ((MTRAccessControlClusterTarget *) temp_3[13]).endpoint = [NSNumber numberWithUnsignedShort:14U];
                ((MTRAccessControlClusterTarget *) temp_3[13]).deviceType = nil;

                temp_3[14] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[14]).cluster = nil;
                ((MTRAccessControlClusterTarget *) temp_3[14]).endpoint = [NSNumber numberWithUnsignedShort:15U];
                ((MTRAccessControlClusterTarget *) temp_3[14]).deviceType = nil;

                temp_3[15] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[15]).cluster = nil;
                ((MTRAccessControlClusterTarget *) temp_3[15]).endpoint = [NSNumber numberWithUnsignedShort:16U];
                ((MTRAccessControlClusterTarget *) temp_3[15]).deviceType = nil;

                temp_3[16] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[16]).cluster = nil;
                ((MTRAccessControlClusterTarget *) temp_3[16]).endpoint = [NSNumber numberWithUnsignedShort:17U];
                ((MTRAccessControlClusterTarget *) temp_3[16]).deviceType = nil;

                temp_3[17] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[17]).cluster = nil;
                ((MTRAccessControlClusterTarget *) temp_3[17]).endpoint = [NSNumber numberWithUnsignedShort:18U];
                ((MTRAccessControlClusterTarget *) temp_3[17]).deviceType = nil;

                temp_3[18] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[18]).cluster = nil;
                ((MTRAccessControlClusterTarget *) temp_3[18]).endpoint = [NSNumber numberWithUnsignedShort:19U];
                ((MTRAccessControlClusterTarget *) temp_3[18]).deviceType = nil;

                temp_3[19] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[19]).cluster = nil;
                ((MTRAccessControlClusterTarget *) temp_3[19]).endpoint = [NSNumber numberWithUnsignedShort:20U];
                ((MTRAccessControlClusterTarget *) temp_3[19]).deviceType = nil;

                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).targets = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).fabricIndex = [NSNumber numberWithUnsignedChar:0U];

            aclArgument = temp_0;
        }
        [cluster writeAttributeACLWithValue:aclArgument
                                 completion:^(NSError * _Nullable err) {
                                     NSLog(@"Write entry too many targets Error: %@", err);

                                     VerifyOrReturn(CheckValue("status",
                                         err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                       : EMBER_ZCL_STATUS_FAILURE)
                                             : 0,
                                         EMBER_ZCL_STATUS_FAILURE));
                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerify_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRReadParams alloc] init];
        params.filterByFabric = true;
        [cluster readAttributeACLWithParams:params
                                 completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                     NSLog(@"Verify Error: %@", err);

                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                     {
                                         id actualValue = value;
                                         VerifyOrReturn(CheckValue("ACL", [actualValue count], static_cast<uint32_t>(1)));
                                         VerifyOrReturn(CheckValue("Privilege",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).privilege, 5U));
                                         VerifyOrReturn(CheckValue("AuthMode",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).authMode, 2U));
                                         VerifyOrReturn(CheckValueNull("Subjects",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).subjects));
                                         VerifyOrReturn(CheckValueNull("Targets",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).targets));
                                         VerifyOrReturn(CheckValue("FabricIndex",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).fabricIndex, 1U));
                                     }

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteTooManyEntries_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id aclArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).subjects = nil;
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[0]).cluster = nil;
                ((MTRAccessControlClusterTarget *) temp_3[0]).endpoint = [NSNumber numberWithUnsignedShort:0U];
                ((MTRAccessControlClusterTarget *) temp_3[0]).deviceType = nil;

                temp_3[1] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[1]).cluster = [NSNumber numberWithUnsignedInt:1UL];
                ((MTRAccessControlClusterTarget *) temp_3[1]).endpoint = nil;
                ((MTRAccessControlClusterTarget *) temp_3[1]).deviceType = nil;

                temp_3[2] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[2]).cluster = [NSNumber numberWithUnsignedInt:2UL];
                ((MTRAccessControlClusterTarget *) temp_3[2]).endpoint = [NSNumber numberWithUnsignedShort:3U];
                ((MTRAccessControlClusterTarget *) temp_3[2]).deviceType = nil;

                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).targets = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:0U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:1U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:4ULL];
                temp_3[1] = [NSNumber numberWithUnsignedLongLong:5ULL];
                temp_3[2] = [NSNumber numberWithUnsignedLongLong:6ULL];
                temp_3[3] = [NSNumber numberWithUnsignedLongLong:7ULL];
                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).subjects = temp_3;
            }
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[0]).cluster = nil;
                ((MTRAccessControlClusterTarget *) temp_3[0]).endpoint = [NSNumber numberWithUnsignedShort:8U];
                ((MTRAccessControlClusterTarget *) temp_3[0]).deviceType = nil;

                temp_3[1] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[1]).cluster = [NSNumber numberWithUnsignedInt:9UL];
                ((MTRAccessControlClusterTarget *) temp_3[1]).endpoint = nil;
                ((MTRAccessControlClusterTarget *) temp_3[1]).deviceType = nil;

                temp_3[2] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[2]).cluster = [NSNumber numberWithUnsignedInt:10UL];
                ((MTRAccessControlClusterTarget *) temp_3[2]).endpoint = [NSNumber numberWithUnsignedShort:11U];
                ((MTRAccessControlClusterTarget *) temp_3[2]).deviceType = nil;

                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).targets = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).fabricIndex = [NSNumber numberWithUnsignedChar:0U];

            temp_0[2] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[2]).privilege = [NSNumber numberWithUnsignedChar:3U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[2]).authMode = [NSNumber numberWithUnsignedChar:3U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:12ULL];
                temp_3[1] = [NSNumber numberWithUnsignedLongLong:13ULL];
                temp_3[2] = [NSNumber numberWithUnsignedLongLong:14ULL];
                temp_3[3] = [NSNumber numberWithUnsignedLongLong:15ULL];
                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[2]).subjects = temp_3;
            }
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[0]).cluster = nil;
                ((MTRAccessControlClusterTarget *) temp_3[0]).endpoint = [NSNumber numberWithUnsignedShort:16U];
                ((MTRAccessControlClusterTarget *) temp_3[0]).deviceType = nil;

                temp_3[1] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[1]).cluster = [NSNumber numberWithUnsignedInt:17UL];
                ((MTRAccessControlClusterTarget *) temp_3[1]).endpoint = nil;
                ((MTRAccessControlClusterTarget *) temp_3[1]).deviceType = nil;

                temp_3[2] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[2]).cluster = [NSNumber numberWithUnsignedInt:18UL];
                ((MTRAccessControlClusterTarget *) temp_3[2]).endpoint = [NSNumber numberWithUnsignedShort:19U];
                ((MTRAccessControlClusterTarget *) temp_3[2]).deviceType = nil;

                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[2]).targets = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[2]).fabricIndex = [NSNumber numberWithUnsignedChar:0U];

            temp_0[3] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[3]).privilege = [NSNumber numberWithUnsignedChar:1U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[3]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:20ULL];
                temp_3[1] = [NSNumber numberWithUnsignedLongLong:21ULL];
                temp_3[2] = [NSNumber numberWithUnsignedLongLong:22ULL];
                temp_3[3] = [NSNumber numberWithUnsignedLongLong:23ULL];
                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[3]).subjects = temp_3;
            }
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[0]).cluster = nil;
                ((MTRAccessControlClusterTarget *) temp_3[0]).endpoint = [NSNumber numberWithUnsignedShort:24U];
                ((MTRAccessControlClusterTarget *) temp_3[0]).deviceType = nil;

                temp_3[1] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[1]).cluster = [NSNumber numberWithUnsignedInt:25UL];
                ((MTRAccessControlClusterTarget *) temp_3[1]).endpoint = nil;
                ((MTRAccessControlClusterTarget *) temp_3[1]).deviceType = nil;

                temp_3[2] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[2]).cluster = [NSNumber numberWithUnsignedInt:26UL];
                ((MTRAccessControlClusterTarget *) temp_3[2]).endpoint = [NSNumber numberWithUnsignedShort:27U];
                ((MTRAccessControlClusterTarget *) temp_3[2]).deviceType = nil;

                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[3]).targets = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[3]).fabricIndex = [NSNumber numberWithUnsignedChar:0U];

            temp_0[4] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[4]).privilege = [NSNumber numberWithUnsignedChar:3U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[4]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:28ULL];
                temp_3[1] = [NSNumber numberWithUnsignedLongLong:29ULL];
                temp_3[2] = [NSNumber numberWithUnsignedLongLong:30ULL];
                temp_3[3] = [NSNumber numberWithUnsignedLongLong:31ULL];
                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[4]).subjects = temp_3;
            }
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[0]).cluster = nil;
                ((MTRAccessControlClusterTarget *) temp_3[0]).endpoint = [NSNumber numberWithUnsignedShort:32U];
                ((MTRAccessControlClusterTarget *) temp_3[0]).deviceType = nil;

                temp_3[1] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[1]).cluster = [NSNumber numberWithUnsignedInt:33UL];
                ((MTRAccessControlClusterTarget *) temp_3[1]).endpoint = nil;
                ((MTRAccessControlClusterTarget *) temp_3[1]).deviceType = nil;

                temp_3[2] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[2]).cluster = [NSNumber numberWithUnsignedInt:34UL];
                ((MTRAccessControlClusterTarget *) temp_3[2]).endpoint = [NSNumber numberWithUnsignedShort:35U];
                ((MTRAccessControlClusterTarget *) temp_3[2]).deviceType = nil;

                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[4]).targets = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[4]).fabricIndex = [NSNumber numberWithUnsignedChar:0U];

            aclArgument = temp_0;
        }
        [cluster writeAttributeACLWithValue:aclArgument
                                 completion:^(NSError * _Nullable err) {
                                     NSLog(@"Write too many entries Error: %@", err);

                                     VerifyOrReturn(CheckValue("status",
                                         err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                       : EMBER_ZCL_STATUS_FAILURE)
                                             : 0,
                                         EMBER_ZCL_STATUS_RESOURCE_EXHAUSTED));
                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerify_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRReadParams alloc] init];
        params.filterByFabric = true;
        [cluster
            readAttributeACLWithParams:params
                            completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                NSLog(@"Verify Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                {
                                    id actualValue = value;
                                    VerifyOrReturn(CheckValue("ACL", [actualValue count], static_cast<uint32_t>(4)));
                                    VerifyOrReturn(CheckValue("Privilege",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).privilege, 5U));
                                    VerifyOrReturn(CheckValue("AuthMode",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).authMode, 2U));
                                    VerifyOrReturn(CheckValueNull(
                                        "Subjects", ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).subjects));
                                    VerifyOrReturn(CheckValueNonNull(
                                        "Targets", ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).targets));
                                    VerifyOrReturn(CheckValue("Targets",
                                        [((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).targets count],
                                        static_cast<uint32_t>(3)));
                                    VerifyOrReturn(CheckValueNull("Cluster",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[0])
                                                .targets[0])
                                            .cluster));
                                    VerifyOrReturn(CheckValueNonNull("Endpoint",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[0])
                                                .targets[0])
                                            .endpoint));
                                    VerifyOrReturn(CheckValue("Endpoint",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[0])
                                                .targets[0])
                                            .endpoint,
                                        0U));
                                    VerifyOrReturn(CheckValueNull("DeviceType",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[0])
                                                .targets[0])
                                            .deviceType));
                                    VerifyOrReturn(CheckValueNonNull("Cluster",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[0])
                                                .targets[1])
                                            .cluster));
                                    VerifyOrReturn(CheckValue("Cluster",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[0])
                                                .targets[1])
                                            .cluster,
                                        1UL));
                                    VerifyOrReturn(CheckValueNull("Endpoint",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[0])
                                                .targets[1])
                                            .endpoint));
                                    VerifyOrReturn(CheckValueNull("DeviceType",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[0])
                                                .targets[1])
                                            .deviceType));
                                    VerifyOrReturn(CheckValueNonNull("Cluster",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[0])
                                                .targets[2])
                                            .cluster));
                                    VerifyOrReturn(CheckValue("Cluster",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[0])
                                                .targets[2])
                                            .cluster,
                                        2UL));
                                    VerifyOrReturn(CheckValueNonNull("Endpoint",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[0])
                                                .targets[2])
                                            .endpoint));
                                    VerifyOrReturn(CheckValue("Endpoint",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[0])
                                                .targets[2])
                                            .endpoint,
                                        3U));
                                    VerifyOrReturn(CheckValueNull("DeviceType",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[0])
                                                .targets[2])
                                            .deviceType));
                                    VerifyOrReturn(CheckValue("FabricIndex",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).fabricIndex, 1U));
                                    VerifyOrReturn(CheckValue("Privilege",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[1]).privilege, 1U));
                                    VerifyOrReturn(CheckValue("AuthMode",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[1]).authMode, 2U));
                                    VerifyOrReturn(CheckValueNonNull(
                                        "Subjects", ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[1]).subjects));
                                    VerifyOrReturn(CheckValue("Subjects",
                                        [((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[1]).subjects count],
                                        static_cast<uint32_t>(4)));
                                    VerifyOrReturn(CheckValue("",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[1]).subjects[0], 4ULL));
                                    VerifyOrReturn(CheckValue("",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[1]).subjects[1], 5ULL));
                                    VerifyOrReturn(CheckValue("",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[1]).subjects[2], 6ULL));
                                    VerifyOrReturn(CheckValue("",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[1]).subjects[3], 7ULL));
                                    VerifyOrReturn(CheckValueNonNull(
                                        "Targets", ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[1]).targets));
                                    VerifyOrReturn(CheckValue("Targets",
                                        [((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[1]).targets count],
                                        static_cast<uint32_t>(3)));
                                    VerifyOrReturn(CheckValueNull("Cluster",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[1])
                                                .targets[0])
                                            .cluster));
                                    VerifyOrReturn(CheckValueNonNull("Endpoint",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[1])
                                                .targets[0])
                                            .endpoint));
                                    VerifyOrReturn(CheckValue("Endpoint",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[1])
                                                .targets[0])
                                            .endpoint,
                                        8U));
                                    VerifyOrReturn(CheckValueNull("DeviceType",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[1])
                                                .targets[0])
                                            .deviceType));
                                    VerifyOrReturn(CheckValueNonNull("Cluster",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[1])
                                                .targets[1])
                                            .cluster));
                                    VerifyOrReturn(CheckValue("Cluster",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[1])
                                                .targets[1])
                                            .cluster,
                                        9UL));
                                    VerifyOrReturn(CheckValueNull("Endpoint",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[1])
                                                .targets[1])
                                            .endpoint));
                                    VerifyOrReturn(CheckValueNull("DeviceType",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[1])
                                                .targets[1])
                                            .deviceType));
                                    VerifyOrReturn(CheckValueNonNull("Cluster",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[1])
                                                .targets[2])
                                            .cluster));
                                    VerifyOrReturn(CheckValue("Cluster",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[1])
                                                .targets[2])
                                            .cluster,
                                        10UL));
                                    VerifyOrReturn(CheckValueNonNull("Endpoint",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[1])
                                                .targets[2])
                                            .endpoint));
                                    VerifyOrReturn(CheckValue("Endpoint",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[1])
                                                .targets[2])
                                            .endpoint,
                                        11U));
                                    VerifyOrReturn(CheckValueNull("DeviceType",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[1])
                                                .targets[2])
                                            .deviceType));
                                    VerifyOrReturn(CheckValue("FabricIndex",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[1]).fabricIndex, 1U));
                                    VerifyOrReturn(CheckValue("Privilege",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[2]).privilege, 3U));
                                    VerifyOrReturn(CheckValue("AuthMode",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[2]).authMode, 3U));
                                    VerifyOrReturn(CheckValueNonNull(
                                        "Subjects", ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[2]).subjects));
                                    VerifyOrReturn(CheckValue("Subjects",
                                        [((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[2]).subjects count],
                                        static_cast<uint32_t>(4)));
                                    VerifyOrReturn(CheckValue("",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[2]).subjects[0], 12ULL));
                                    VerifyOrReturn(CheckValue("",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[2]).subjects[1], 13ULL));
                                    VerifyOrReturn(CheckValue("",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[2]).subjects[2], 14ULL));
                                    VerifyOrReturn(CheckValue("",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[2]).subjects[3], 15ULL));
                                    VerifyOrReturn(CheckValueNonNull(
                                        "Targets", ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[2]).targets));
                                    VerifyOrReturn(CheckValue("Targets",
                                        [((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[2]).targets count],
                                        static_cast<uint32_t>(3)));
                                    VerifyOrReturn(CheckValueNull("Cluster",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[2])
                                                .targets[0])
                                            .cluster));
                                    VerifyOrReturn(CheckValueNonNull("Endpoint",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[2])
                                                .targets[0])
                                            .endpoint));
                                    VerifyOrReturn(CheckValue("Endpoint",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[2])
                                                .targets[0])
                                            .endpoint,
                                        16U));
                                    VerifyOrReturn(CheckValueNull("DeviceType",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[2])
                                                .targets[0])
                                            .deviceType));
                                    VerifyOrReturn(CheckValueNonNull("Cluster",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[2])
                                                .targets[1])
                                            .cluster));
                                    VerifyOrReturn(CheckValue("Cluster",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[2])
                                                .targets[1])
                                            .cluster,
                                        17UL));
                                    VerifyOrReturn(CheckValueNull("Endpoint",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[2])
                                                .targets[1])
                                            .endpoint));
                                    VerifyOrReturn(CheckValueNull("DeviceType",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[2])
                                                .targets[1])
                                            .deviceType));
                                    VerifyOrReturn(CheckValueNonNull("Cluster",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[2])
                                                .targets[2])
                                            .cluster));
                                    VerifyOrReturn(CheckValue("Cluster",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[2])
                                                .targets[2])
                                            .cluster,
                                        18UL));
                                    VerifyOrReturn(CheckValueNonNull("Endpoint",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[2])
                                                .targets[2])
                                            .endpoint));
                                    VerifyOrReturn(CheckValue("Endpoint",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[2])
                                                .targets[2])
                                            .endpoint,
                                        19U));
                                    VerifyOrReturn(CheckValueNull("DeviceType",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[2])
                                                .targets[2])
                                            .deviceType));
                                    VerifyOrReturn(CheckValue("FabricIndex",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[2]).fabricIndex, 1U));
                                    VerifyOrReturn(CheckValue("Privilege",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[3]).privilege, 1U));
                                    VerifyOrReturn(CheckValue("AuthMode",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[3]).authMode, 2U));
                                    VerifyOrReturn(CheckValueNonNull(
                                        "Subjects", ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[3]).subjects));
                                    VerifyOrReturn(CheckValue("Subjects",
                                        [((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[3]).subjects count],
                                        static_cast<uint32_t>(4)));
                                    VerifyOrReturn(CheckValue("",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[3]).subjects[0], 20ULL));
                                    VerifyOrReturn(CheckValue("",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[3]).subjects[1], 21ULL));
                                    VerifyOrReturn(CheckValue("",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[3]).subjects[2], 22ULL));
                                    VerifyOrReturn(CheckValue("",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[3]).subjects[3], 23ULL));
                                    VerifyOrReturn(CheckValueNonNull(
                                        "Targets", ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[3]).targets));
                                    VerifyOrReturn(CheckValue("Targets",
                                        [((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[3]).targets count],
                                        static_cast<uint32_t>(3)));
                                    VerifyOrReturn(CheckValueNull("Cluster",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[3])
                                                .targets[0])
                                            .cluster));
                                    VerifyOrReturn(CheckValueNonNull("Endpoint",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[3])
                                                .targets[0])
                                            .endpoint));
                                    VerifyOrReturn(CheckValue("Endpoint",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[3])
                                                .targets[0])
                                            .endpoint,
                                        24U));
                                    VerifyOrReturn(CheckValueNull("DeviceType",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[3])
                                                .targets[0])
                                            .deviceType));
                                    VerifyOrReturn(CheckValueNonNull("Cluster",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[3])
                                                .targets[1])
                                            .cluster));
                                    VerifyOrReturn(CheckValue("Cluster",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[3])
                                                .targets[1])
                                            .cluster,
                                        25UL));
                                    VerifyOrReturn(CheckValueNull("Endpoint",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[3])
                                                .targets[1])
                                            .endpoint));
                                    VerifyOrReturn(CheckValueNull("DeviceType",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[3])
                                                .targets[1])
                                            .deviceType));
                                    VerifyOrReturn(CheckValueNonNull("Cluster",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[3])
                                                .targets[2])
                                            .cluster));
                                    VerifyOrReturn(CheckValue("Cluster",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[3])
                                                .targets[2])
                                            .cluster,
                                        26UL));
                                    VerifyOrReturn(CheckValueNonNull("Endpoint",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[3])
                                                .targets[2])
                                            .endpoint));
                                    VerifyOrReturn(CheckValue("Endpoint",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[3])
                                                .targets[2])
                                            .endpoint,
                                        27U));
                                    VerifyOrReturn(CheckValueNull("DeviceType",
                                        ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntryStruct *)
                                                                                actualValue[3])
                                                .targets[2])
                                            .deviceType));
                                    VerifyOrReturn(CheckValue("FabricIndex",
                                        ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[3]).fabricIndex, 1U));
                                }

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRestoreAcl_19()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id aclArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).subjects = nil;
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:0U];

            aclArgument = temp_0;
        }
        [cluster writeAttributeACLWithValue:aclArgument
                                 completion:^(NSError * _Nullable err) {
                                     NSLog(@"Restore ACL Error: %@", err);

                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerify_20()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRReadParams alloc] init];
        params.filterByFabric = true;
        [cluster readAttributeACLWithParams:params
                                 completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                     NSLog(@"Verify Error: %@", err);

                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                     {
                                         id actualValue = value;
                                         VerifyOrReturn(CheckValue("ACL", [actualValue count], static_cast<uint32_t>(1)));
                                         VerifyOrReturn(CheckValue("Privilege",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).privilege, 5U));
                                         VerifyOrReturn(CheckValue("AuthMode",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).authMode, 2U));
                                         VerifyOrReturn(CheckValueNull("Subjects",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).subjects));
                                         VerifyOrReturn(CheckValueNull("Targets",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).targets));
                                         VerifyOrReturn(CheckValue("FabricIndex",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).fabricIndex, 1U));
                                     }

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestValidateResourceMinimaSubjectsPerAccessControlEntry_21()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSubjectsPerAccessControlEntryWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Validate resource minima (SubjectsPerAccessControlEntry) Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("subjectsPerAccessControlEntry", [value unsignedShortValue], 4U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestValidateResourceMinimaTargetsPerAccessControlEntry_22()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetsPerAccessControlEntryWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Validate resource minima (TargetsPerAccessControlEntry) Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("targetsPerAccessControlEntry", [value unsignedShortValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestValidateResourceMinimaAccessControlEntriesPerFabric_23()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAccessControlEntriesPerFabricWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Validate resource minima (AccessControlEntriesPerFabric) Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("accessControlEntriesPerFabric", [value unsignedShortValue], 4U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_ACL_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_ACL_1_1()
        : TestCommandBridge("Test_TC_ACL_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_ACL_1_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_ACL_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_ACL_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads ClusterRevision attribute from DUT\n");
            err = TestThReadsClusterRevisionAttributeFromDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads FeatureMap attribute from DUT\n");
            err = TestThReadsFeatureMapAttributeFromDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : TH reads AttributeList attribute from DUT\n");
            err = TestThReadsAttributeListAttributeFromDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH reads optional attribute (Extension) in AttributeList\n");
            if (ShouldSkip("ACL.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeExtensionInAttributeList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH reads AcceptedCommandList attribute from DUT\n");
            err = TestThReadsAcceptedCommandListAttributeFromDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : TH reads GeneratedCommandList attribute from DUT\n");
            err = TestThReadsGeneratedCommandListAttributeFromDut_6();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 7;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsClusterRevisionAttributeFromDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ClusterRevision attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureMapAttributeFromDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads FeatureMap attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAttributeListAttributeFromDut_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AttributeList attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 3UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 4UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeExtensionInAttributeList_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute (Extension) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAcceptedCommandListAttributeFromDut_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AcceptedCommandList attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsGeneratedCommandListAttributeFromDut_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads GeneratedCommandList attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_ACL_2_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_ACL_2_1()
        : TestCommandBridge("Test_TC_ACL_2_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_ACL_2_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_ACL_2_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_ACL_2_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads SubjectsPerAccessControlEntry attribute from DUT\n");
            if (ShouldSkip("ACL.S.A0002")) {
                NextTest();
                return;
            }
            err = TestThReadsSubjectsPerAccessControlEntryAttributeFromDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads TargetsPerAccessControlEntry attribute from DUT\n");
            if (ShouldSkip("ACL.S.A0003")) {
                NextTest();
                return;
            }
            err = TestThReadsTargetsPerAccessControlEntryAttributeFromDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : TH reads AccessControlEntriesPerFabric attribute from DUT\n");
            if (ShouldSkip("ACL.S.A0002")) {
                NextTest();
                return;
            }
            err = TestThReadsAccessControlEntriesPerFabricAttributeFromDut_3();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 4;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsSubjectsPerAccessControlEntryAttributeFromDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSubjectsPerAccessControlEntryWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads SubjectsPerAccessControlEntry attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("subjectsPerAccessControlEntry", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("subjectsPerAccessControlEntry", [value unsignedShortValue], 4U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("subjectsPerAccessControlEntry", [value unsignedShortValue], 65535U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTargetsPerAccessControlEntryAttributeFromDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetsPerAccessControlEntryWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads TargetsPerAccessControlEntry attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("targetsPerAccessControlEntry", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("targetsPerAccessControlEntry", [value unsignedShortValue], 3U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("targetsPerAccessControlEntry", [value unsignedShortValue], 65535U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAccessControlEntriesPerFabricAttributeFromDut_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAccessControlEntriesPerFabricWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AccessControlEntriesPerFabric attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("accessControlEntriesPerFabric", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("accessControlEntriesPerFabric", [value unsignedShortValue], 3U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("accessControlEntriesPerFabric", [value unsignedShortValue], 65535U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_ACL_2_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_ACL_2_2()
        : TestCommandBridge("Test_TC_ACL_2_2")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_ACL_2_2() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_ACL_2_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_ACL_2_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(
                chipTool, " ***** Test Step 1 : TH1 reads DUT Descriptor cluster ServerList attribute from Endpoint 0\n");
            err = TestTh1ReadsDutDescriptorClusterServerListAttributeFromEndpoint0_1();
            break;
        case 2:
            ChipLogProgress(chipTool,
                " ***** Test Step 2 : TH1 reads DUT Descriptor cluster ServerList attribute from every Endpoint except 0\n");
            if (ShouldSkip("PICS_USER_PROMPT")) {
                NextTest();
                return;
            }
            err = TestTh1ReadsDutDescriptorClusterServerListAttributeFromEveryEndpointExcept0_2();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 3;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestTh1ReadsDutDescriptorClusterServerListAttributeFromEndpoint0_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeServerListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH1 reads DUT Descriptor cluster ServerList attribute from Endpoint 0 Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("serverList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("serverList", value, 31UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTh1ReadsDutDescriptorClusterServerListAttributeFromEveryEndpointExcept0_2()
    {

        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("alpha", value);
    }
};

class Test_TC_ACL_2_3 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_ACL_2_3()
        : TestCommandBridge("Test_TC_ACL_2_3")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("D_OK_EMPTY", &mDOkEmpty);
        AddArgument("D_OK_SINGLE", &mDOkSingle);
        AddArgument("D_OK_FULL", &mDOkFull);
        AddArgument("D_BAD_LENGTH", &mDBadLength);
        AddArgument("D_BAD_STRUCT", &mDBadStruct);
        AddArgument("D_BAD_LIST", &mDBadList);
        AddArgument("D_BAD_ELEM", &mDBadElem);
        AddArgument("D_BAD_OVERFLOW", &mDBadOverflow);
        AddArgument("D_BAD_UNDERFLOW", &mDBadUnderflow);
        AddArgument("D_BAD_NONE", &mDBadNone);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_ACL_2_3() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_ACL_2_3\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_ACL_2_3\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool,
                " ***** Test Step 1 : TH1 reads DUT Endpoint 0 OperationalCredentials cluster CurrentFabricIndex attribute\n");
            err = TestTh1ReadsDutEndpoint0OperationalCredentialsClusterCurrentFabricIndexAttribute_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH1 reads DUT Endpoint 0 AccessControl cluster Extension attribute\n");
            if (ShouldSkip("ACL.S.A0001")) {
                NextTest();
                return;
            }
            err = TestTh1ReadsDutEndpoint0AccessControlClusterExtensionAttribute_2();
            break;
        case 3:
            ChipLogProgress(chipTool,
                " ***** Test Step 3 : TH1 writes DUT Endpoint 0 AccessControl cluster Extension attribute, value is list of "
                "AccessControlExtensionStruct containing 1 element 1. struct: Data field: D_OK_EMPTY : 1718\n");
            if (ShouldSkip("ACL.S.A0001")) {
                NextTest();
                return;
            }
            err = TestTh1WritesDutEndpoint0AccessControlClusterExtensionAttributeValueIsListOfAccessControlExtensionStructContaining1Element1StructDataFieldDOkEmpty1718_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH1 reads DUT Endpoint 0 AccessControl cluster Extension attribute\n");
            if (ShouldSkip("ACL.S.A0001")) {
                NextTest();
                return;
            }
            err = TestTh1ReadsDutEndpoint0AccessControlClusterExtensionAttribute_4();
            break;
        case 5:
            ChipLogProgress(chipTool,
                " ***** Test Step 5 : TH1 writes DUT Endpoint 0 AccessControl cluster Extension attribute, value is list of "
                "AccessControlExtensionStruct containing 1 element 1.struct Data field: D_OK_SINGLE "
                ":17D00000F1FF01003D48656C6C6F20576F726C642E205468697320697320612073696E676C6520656C656D656E74206C6976696E672061732"
                "0612063686172737472696E670018\n");
            if (ShouldSkip("ACL.S.A0001")) {
                NextTest();
                return;
            }
            err = TestTh1WritesDutEndpoint0AccessControlClusterExtensionAttributeValueIsListOfAccessControlExtensionStructContaining1Element1structDataFieldDOkSingle17d00000f1ff01003d48656c6c6f20576f726c642e205468697320697320612073696e676c6520656c656d656e74206c6976696e6720617320612063686172737472696e670018_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : TH1 reads DUT Endpoint 0 AccessControl cluster Extension attribute\n");
            if (ShouldSkip("ACL.S.A0001")) {
                NextTest();
                return;
            }
            err = TestTh1ReadsDutEndpoint0AccessControlClusterExtensionAttribute_6();
            break;
        case 7:
            ChipLogProgress(chipTool,
                " ***** Test Step 7 : TH1 writes DUT Endpoint 0 AccessControl cluster Extension attribute, value is list of "
                "AccessControlExtensionStruct containing 1 element 1.struct Data field: D_OK_FULL "
                ":17D00000F1FF01003D48656C6C6F20576F726C642E205468697320697320612073696E676C6520656C656D656E74206C6976696E672061732"
                "0612063686172737472696E6700D00000F1FF02003148656C6C6F20576F726C642E205468697320697320612073696E676C6520656C656D656"
                "E7420616761696E2E2E2E2E2E0018\n");
            if (ShouldSkip("ACL.S.A0001")) {
                NextTest();
                return;
            }
            err = TestTh1WritesDutEndpoint0AccessControlClusterExtensionAttributeValueIsListOfAccessControlExtensionStructContaining1Element1structDataFieldDOkFull17d00000f1ff01003d48656c6c6f20576f726c642e205468697320697320612073696e676c6520656c656d656e74206c6976696e6720617320612063686172737472696e6700d00000f1ff02003148656c6c6f20576f726c642e205468697320697320612073696e676c6520656c656d656e7420616761696e2e2e2e2e2e0018_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : TH1 reads DUT Endpoint 0 AccessControl cluster Extension attribute\n");
            if (ShouldSkip("ACL.S.A0001")) {
                NextTest();
                return;
            }
            err = TestTh1ReadsDutEndpoint0AccessControlClusterExtensionAttribute_8();
            break;
        case 9:
            ChipLogProgress(chipTool,
                " ***** Test Step 9 : TH1 writes DUT Endpoint 0 AccessControl cluster Extension attribute, value is list of "
                "AccessControlExtensionStruct containing 1 element 1 .struct Data field: D_BAD_LENGTH "
                ":17D00000F1FF01003D48656C6C6F20576F726C642E205468697320697320612073696E676C6520656C656D656E74206C6976696E672061732"
                "0612063686172737472696E6700D00000F1FF02003248656C6C6F20576F726C642E205468697320697320612073696E676C6520656C656D656"
                "E7420616761696E2E2E2E2E2E2E0018\n");
            if (ShouldSkip("ACL.S.A0001")) {
                NextTest();
                return;
            }
            err = TestTh1WritesDutEndpoint0AccessControlClusterExtensionAttributeValueIsListOfAccessControlExtensionStructContaining1Element1structDataFieldDBadLength17d00000f1ff01003d48656c6c6f20576f726c642e205468697320697320612073696e676c6520656c656d656e74206c6976696e6720617320612063686172737472696e6700d00000f1ff02003248656c6c6f20576f726c642e205468697320697320612073696e676c6520656c656d656e7420616761696e2e2e2e2e2e2e0018_9();
            break;
        case 10:
            ChipLogProgress(chipTool,
                " ***** Test Step 10 : TH1 writes DUT Endpoint 0 AccessControl cluster Extension attribute, value is list of "
                "AccessControlExtensionStruct containing 1 element 1. struct Data field: D_BAD_STRUCT : 1518\n");
            if (ShouldSkip("ACL.S.A0001")) {
                NextTest();
                return;
            }
            err = TestTh1WritesDutEndpoint0AccessControlClusterExtensionAttributeValueIsListOfAccessControlExtensionStructContaining1Element1StructDataFieldDBadStruct1518_10();
            break;
        case 11:
            ChipLogProgress(chipTool,
                " ***** Test Step 11 : TH1 writes DUT Endpoint 0 AccessControl cluster Extension attribute, value is list of "
                "AccessControlExtensionStruct containing 1 element 1. struct Data field: D_BAD_LIST "
                ":3701D00000F1FF01003D48656C6C6F20576F726C642E205468697320697320612073696E676C6520656C656D656E74206C6976696E6720617"
                "320612063686172737472696E670018\n");
            if (ShouldSkip("ACL.S.A0001")) {
                NextTest();
                return;
            }
            err = TestTh1WritesDutEndpoint0AccessControlClusterExtensionAttributeValueIsListOfAccessControlExtensionStructContaining1Element1StructDataFieldDBadList3701d00000f1ff01003d48656c6c6f20576f726c642e205468697320697320612073696e676c6520656c656d656e74206c6976696e6720617320612063686172737472696e670018_11();
            break;
        case 12:
            ChipLogProgress(chipTool,
                " ***** Test Step 12 : TH1 writes DUT Endpoint 0 AccessControl cluster Extension attribute, value is list of "
                "AccessControlExtensionStruct containing 1 element 1. struct Data field: D_BAD_ELEM "
                ":17103D48656C6C6F20576F726C642E205468697320697320612073696E676C6520656C656D656E74206C6976696E672061732061206368617"
                "2737472696E670018\n");
            if (ShouldSkip("ACL.S.A0001")) {
                NextTest();
                return;
            }
            err = TestTh1WritesDutEndpoint0AccessControlClusterExtensionAttributeValueIsListOfAccessControlExtensionStructContaining1Element1StructDataFieldDBadElem17103d48656c6c6f20576f726c642e205468697320697320612073696e676c6520656c656d656e74206c6976696e6720617320612063686172737472696e670018_12();
            break;
        case 13:
            ChipLogProgress(chipTool,
                " ***** Test Step 13 : TH1 writes DUT Endpoint 0 AccessControl cluster Extension attribute, value is list of "
                "AccessControlExtensionStruct containing 1 element 1 .struct Data field: D_BAD_OVERFLOW : "
                "17D00000F1FF01003D48656C6C6F20576F726C642E205468697320697320612073696E676C6520656C656D656E74206C6976696E6720617320"
                "612063686172737472696E670018FF\n");
            if (ShouldSkip("ACL.S.A0001")) {
                NextTest();
                return;
            }
            err = TestTh1WritesDutEndpoint0AccessControlClusterExtensionAttributeValueIsListOfAccessControlExtensionStructContaining1Element1structDataFieldDBadOverflow17d00000f1ff01003d48656c6c6f20576f726c642e205468697320697320612073696e676c6520656c656d656e74206c6976696e6720617320612063686172737472696e670018ff_13();
            break;
        case 14:
            ChipLogProgress(chipTool,
                " ***** Test Step 14 : TH1 writes DUT Endpoint 0 AccessControl cluster Extension attribute, value is list of "
                "AccessControlExtensionStruct containing 1 element 1. struct Data field: D_BAD_UNDERFLOW "
                ":17D00000F1FF01003D48656C6C6F20576F726C642E205468697320697320612073696E676C6520656C656D656E74206C6976696E672061732"
                "0612063686172737472696E6700\n");
            if (ShouldSkip("ACL.S.A0001")) {
                NextTest();
                return;
            }
            err = TestTh1WritesDutEndpoint0AccessControlClusterExtensionAttributeValueIsListOfAccessControlExtensionStructContaining1Element1StructDataFieldDBadUnderflow17d00000f1ff01003d48656c6c6f20576f726c642e205468697320697320612073696e676c6520656c656d656e74206c6976696e6720617320612063686172737472696e6700_14();
            break;
        case 15:
            ChipLogProgress(chipTool,
                " ***** Test Step 15 : TH1 writes DUT Endpoint 0 AccessControl cluster Extension attribute, value is list of "
                "AccessControlExtensionStruct containing 1 element 1.struct Data field: D_BAD_NONE\n");
            if (ShouldSkip("ACL.S.A0001")) {
                NextTest();
                return;
            }
            err = TestTh1WritesDutEndpoint0AccessControlClusterExtensionAttributeValueIsListOfAccessControlExtensionStructContaining1Element1structDataFieldDBadNone_15();
            break;
        case 16:
            ChipLogProgress(chipTool,
                " ***** Test Step 16 : TH1 writes DUT Endpoint 0 AccessControl cluster Extension attribute, value is list of "
                "AccessControlExtensionStruct containing 2 elements . value is list of AccessControlExtensionStruct containing 2 "
                "elements . first element contains Data field: D_OK_EMPTY 1718 . second element contains Data field: D_OK_SINGLE "
                "17D00000F1FF01003D48656C6C6F20576F726C642E205468697320697320612073696E676C6520656C656D656E74206C6976696E6720617320"
                "612063686172737472696E670018\n");
            if (ShouldSkip("ACL.S.A0001")) {
                NextTest();
                return;
            }
            err = TestTh1WritesDutEndpoint0AccessControlClusterExtensionAttributeValueIsListOfAccessControlExtensionStructContaining2ElementsValueIsListOfAccessControlExtensionStructContaining2ElementsFirstElementContainsDataFieldDOkEmpty1718SecondElementContainsDataFieldDOkSingle17d00000f1ff01003d48656c6c6f20576f726c642e205468697320697320612073696e676c6520656c656d656e74206c6976696e6720617320612063686172737472696e670018_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : TH1 reads DUT Endpoint 0 AccessControl cluster Extension attribute\n");
            if (ShouldSkip("ACL.S.A0001")) {
                NextTest();
                return;
            }
            err = TestTh1ReadsDutEndpoint0AccessControlClusterExtensionAttribute_17();
            break;
        case 18:
            ChipLogProgress(chipTool,
                " ***** Test Step 18 : TH1 writes DUT Endpoint 0 AccessControl cluster Extension attribute, value is an empty "
                "list\n");
            if (ShouldSkip("ACL.S.A0001")) {
                NextTest();
                return;
            }
            err = TestTh1WritesDutEndpoint0AccessControlClusterExtensionAttributeValueIsAnEmptyList_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : TH1 reads DUT Endpoint 0 AccessControl cluster Extension attribute\n");
            if (ShouldSkip("ACL.S.A0001")) {
                NextTest();
                return;
            }
            err = TestTh1ReadsDutEndpoint0AccessControlClusterExtensionAttribute_19();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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;
        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), 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), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 20;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<chip::ByteSpan> mDOkEmpty;
    chip::Optional<chip::ByteSpan> mDOkSingle;
    chip::Optional<chip::ByteSpan> mDOkFull;
    chip::Optional<chip::ByteSpan> mDBadLength;
    chip::Optional<chip::ByteSpan> mDBadStruct;
    chip::Optional<chip::ByteSpan> mDBadList;
    chip::Optional<chip::ByteSpan> mDBadElem;
    chip::Optional<chip::ByteSpan> mDBadOverflow;
    chip::Optional<chip::ByteSpan> mDBadUnderflow;
    chip::Optional<chip::ByteSpan> mDBadNone;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }
    NSNumber * _Nonnull CurrentFabricIndex;

    CHIP_ERROR TestTh1ReadsDutEndpoint0OperationalCredentialsClusterCurrentFabricIndexAttribute_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentFabricIndexWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH1 reads DUT Endpoint 0 OperationalCredentials cluster CurrentFabricIndex attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                CurrentFabricIndex = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTh1ReadsDutEndpoint0AccessControlClusterExtensionAttribute_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRReadParams alloc] init];
        params.filterByFabric = true;
        [cluster
            readAttributeExtensionWithParams:params
                                  completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                      NSLog(@"TH1 reads DUT Endpoint 0 AccessControl cluster Extension attribute Error: %@", err);

                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                      {
                                          id actualValue = value;
                                          VerifyOrReturn(CheckValue("Extension", [actualValue count], static_cast<uint32_t>(0)));
                                      }

                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestTh1WritesDutEndpoint0AccessControlClusterExtensionAttributeValueIsListOfAccessControlExtensionStructContaining1Element1StructDataFieldDOkEmpty1718_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id extensionArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRAccessControlClusterAccessControlExtensionStruct alloc] init];
            ((MTRAccessControlClusterAccessControlExtensionStruct *) temp_0[0]).data = mDOkEmpty.HasValue()
                ? [NSData dataWithBytes:mDOkEmpty.Value().data() length:mDOkEmpty.Value().size()]
                : [[NSData alloc] initWithBytes:"\x17\x18" length:2];
            ((MTRAccessControlClusterAccessControlExtensionStruct *) temp_0[0]).fabricIndex = [CurrentFabricIndex copy];

            extensionArgument = temp_0;
        }
        [cluster writeAttributeExtensionWithValue:extensionArgument
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(@"TH1 writes DUT Endpoint 0 AccessControl cluster Extension attribute, value is "
                                                 @"list of AccessControlExtensionStruct containing 1 element 1. struct: Data "
                                                 @"field: D_OK_EMPTY : 1718 Error: %@",
                                               err);

                                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTh1ReadsDutEndpoint0AccessControlClusterExtensionAttribute_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRReadParams alloc] init];
        params.filterByFabric = true;
        [cluster
            readAttributeExtensionWithParams:params
                                  completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                      NSLog(@"TH1 reads DUT Endpoint 0 AccessControl cluster Extension attribute Error: %@", err);

                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                      {
                                          id actualValue = value;
                                          VerifyOrReturn(CheckValue("Extension", [actualValue count], static_cast<uint32_t>(1)));
                                          VerifyOrReturn(CheckValueAsString(
                                              "Data", ((MTRAccessControlClusterAccessControlExtensionStruct *) actualValue[0]).data,
                                              mDOkEmpty.HasValue() ? [NSData dataWithBytes:mDOkEmpty.Value().data()
                                                                                    length:mDOkEmpty.Value().size()]
                                                                   : [[NSData alloc] initWithBytes:"\x17\x18" length:2]

                                              ));
                                          VerifyOrReturn(CheckValue("FabricIndex",
                                              ((MTRAccessControlClusterAccessControlExtensionStruct *) actualValue[0]).fabricIndex,
                                              CurrentFabricIndex));
                                      }

                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestTh1WritesDutEndpoint0AccessControlClusterExtensionAttributeValueIsListOfAccessControlExtensionStructContaining1Element1structDataFieldDOkSingle17d00000f1ff01003d48656c6c6f20576f726c642e205468697320697320612073696e676c6520656c656d656e74206c6976696e6720617320612063686172737472696e670018_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id extensionArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRAccessControlClusterAccessControlExtensionStruct alloc] init];
            ((MTRAccessControlClusterAccessControlExtensionStruct *) temp_0[0]).data = mDOkSingle.HasValue()
                ? [NSData dataWithBytes:mDOkSingle.Value().data() length:mDOkSingle.Value().size()]
                : [[NSData alloc]
                    initWithBytes:"\x17\xD0\x00\x00\xF1\xFF\x01\x00\x3D\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x2E\x20\x54\x68"
                                  "\x69\x73\x20\x69\x73\x20\x61\x20\x73\x69\x6E\x67\x6C\x65\x20\x65\x6C\x65\x6D\x65\x6E\x74\x20\x6C"
                                  "\x69\x76\x69\x6E\x67\x20\x61\x73\x20\x61\x20\x63\x68\x61\x72\x73\x74\x72\x69\x6E\x67\x00\x18"
                           length:71];
            ((MTRAccessControlClusterAccessControlExtensionStruct *) temp_0[0]).fabricIndex = [CurrentFabricIndex copy];

            extensionArgument = temp_0;
        }
        [cluster
            writeAttributeExtensionWithValue:extensionArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(
                                          @"TH1 writes DUT Endpoint 0 AccessControl cluster Extension attribute, value is list of "
                                          @"AccessControlExtensionStruct containing 1 element 1.struct Data field: D_OK_SINGLE "
                                          @":17D00000F1FF01003D48656C6C6F20576F726C642E205468697320697320612073696E676C6520656C656D"
                                          @"656E74206C6976696E6720617320612063686172737472696E670018 Error: %@",
                                          err);

                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTh1ReadsDutEndpoint0AccessControlClusterExtensionAttribute_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRReadParams alloc] init];
        params.filterByFabric = true;
        [cluster
            readAttributeExtensionWithParams:params
                                  completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                      NSLog(@"TH1 reads DUT Endpoint 0 AccessControl cluster Extension attribute Error: %@", err);

                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                      {
                                          id actualValue = value;
                                          VerifyOrReturn(CheckValue("Extension", [actualValue count], static_cast<uint32_t>(1)));
                                          VerifyOrReturn(CheckValueAsString(
                                              "Data", ((MTRAccessControlClusterAccessControlExtensionStruct *) actualValue[0]).data,
                                              mDOkSingle.HasValue()
                                                  ? [NSData dataWithBytes:mDOkSingle.Value().data()
                                                                   length:mDOkSingle.Value().size()]
                                                  : [[NSData alloc]
                                                      initWithBytes:
                                                          "\x17\xD0\x00\x00\xF1\xFF\x01\x00\x3D\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72"
                                                          "\x6C\x64\x2E\x20\x54\x68\x69\x73\x20\x69\x73\x20\x61\x20\x73\x69\x6E\x67"
                                                          "\x6C\x65\x20\x65\x6C\x65\x6D\x65\x6E\x74\x20\x6C\x69\x76\x69\x6E\x67\x20"
                                                          "\x61\x73\x20\x61\x20\x63\x68\x61\x72\x73\x74\x72\x69\x6E\x67\x00\x18"
                                                             length:71]

                                              ));
                                          VerifyOrReturn(CheckValue("FabricIndex",
                                              ((MTRAccessControlClusterAccessControlExtensionStruct *) actualValue[0]).fabricIndex,
                                              CurrentFabricIndex));
                                      }

                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestTh1WritesDutEndpoint0AccessControlClusterExtensionAttributeValueIsListOfAccessControlExtensionStructContaining1Element1structDataFieldDOkFull17d00000f1ff01003d48656c6c6f20576f726c642e205468697320697320612073696e676c6520656c656d656e74206c6976696e6720617320612063686172737472696e6700d00000f1ff02003148656c6c6f20576f726c642e205468697320697320612073696e676c6520656c656d656e7420616761696e2e2e2e2e2e0018_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id extensionArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRAccessControlClusterAccessControlExtensionStruct alloc] init];
            ((MTRAccessControlClusterAccessControlExtensionStruct *) temp_0[0]).data = mDOkFull.HasValue()
                ? [NSData dataWithBytes:mDOkFull.Value().data() length:mDOkFull.Value().size()]
                : [[NSData alloc]
                    initWithBytes:
                        "\x17\xD0\x00\x00\xF1\xFF\x01\x00\x3D\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x2E\x20\x54\x68\x69\x73"
                        "\x20\x69\x73\x20\x61\x20\x73\x69\x6E\x67\x6C\x65\x20\x65\x6C\x65\x6D\x65\x6E\x74\x20\x6C\x69\x76\x69\x6E"
                        "\x67\x20\x61\x73\x20\x61\x20\x63\x68\x61\x72\x73\x74\x72\x69\x6E\x67\x00\xD0\x00\x00\xF1\xFF\x02\x00\x31"
                        "\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x2E\x20\x54\x68\x69\x73\x20\x69\x73\x20\x61\x20\x73\x69\x6E"
                        "\x67\x6C\x65\x20\x65\x6C\x65\x6D\x65\x6E\x74\x20\x61\x67\x61\x69\x6E\x2E\x2E\x2E\x2E\x2E\x00\x18"
                           length:128];
            ((MTRAccessControlClusterAccessControlExtensionStruct *) temp_0[0]).fabricIndex = [CurrentFabricIndex copy];

            extensionArgument = temp_0;
        }
        [cluster
            writeAttributeExtensionWithValue:extensionArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"TH1 writes DUT Endpoint 0 AccessControl cluster Extension attribute, value is list "
                                            @"of AccessControlExtensionStruct containing 1 element 1.struct Data field: D_OK_FULL "
                                            @":17D00000F1FF01003D48656C6C6F20576F726C642E205468697320697320612073696E676C6520656C65"
                                            @"6D656E74206C6976696E6720617320612063686172737472696E6700D00000F1FF02003148656C6C6F205"
                                            @"76F726C642E205468697320697320612073696E676C6520656C656D656E7420616761696E2E2E2E2E2E00"
                                            @"18 Error: %@",
                                          err);

                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTh1ReadsDutEndpoint0AccessControlClusterExtensionAttribute_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRReadParams alloc] init];
        params.filterByFabric = true;
        [cluster
            readAttributeExtensionWithParams:params
                                  completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                      NSLog(@"TH1 reads DUT Endpoint 0 AccessControl cluster Extension attribute Error: %@", err);

                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                      {
                                          id actualValue = value;
                                          VerifyOrReturn(CheckValue("Extension", [actualValue count], static_cast<uint32_t>(1)));
                                          VerifyOrReturn(CheckValueAsString(
                                              "Data", ((MTRAccessControlClusterAccessControlExtensionStruct *) actualValue[0]).data,
                                              mDOkFull.HasValue()
                                                  ? [NSData dataWithBytes:mDOkFull.Value().data() length:mDOkFull.Value().size()]
                                                  : [[NSData alloc]
                                                      initWithBytes:
                                                          "\x17\xD0\x00\x00\xF1\xFF\x01\x00\x3D\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72"
                                                          "\x6C\x64\x2E\x20\x54\x68\x69\x73\x20\x69\x73\x20\x61\x20\x73\x69\x6E\x67"
                                                          "\x6C\x65\x20\x65\x6C\x65\x6D\x65\x6E\x74\x20\x6C\x69\x76\x69\x6E\x67\x20"
                                                          "\x61\x73\x20\x61\x20\x63\x68\x61\x72\x73\x74\x72\x69\x6E\x67\x00\xD0\x00"
                                                          "\x00\xF1\xFF\x02\x00\x31\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x2E"
                                                          "\x20\x54\x68\x69\x73\x20\x69\x73\x20\x61\x20\x73\x69\x6E\x67\x6C\x65\x20"
                                                          "\x65\x6C\x65\x6D\x65\x6E\x74\x20\x61\x67\x61\x69\x6E\x2E\x2E\x2E\x2E\x2E"
                                                          "\x00\x18"
                                                             length:128]

                                              ));
                                          VerifyOrReturn(CheckValue("FabricIndex",
                                              ((MTRAccessControlClusterAccessControlExtensionStruct *) actualValue[0]).fabricIndex,
                                              CurrentFabricIndex));
                                      }

                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestTh1WritesDutEndpoint0AccessControlClusterExtensionAttributeValueIsListOfAccessControlExtensionStructContaining1Element1structDataFieldDBadLength17d00000f1ff01003d48656c6c6f20576f726c642e205468697320697320612073696e676c6520656c656d656e74206c6976696e6720617320612063686172737472696e6700d00000f1ff02003248656c6c6f20576f726c642e205468697320697320612073696e676c6520656c656d656e7420616761696e2e2e2e2e2e2e0018_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id extensionArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRAccessControlClusterAccessControlExtensionStruct alloc] init];
            ((MTRAccessControlClusterAccessControlExtensionStruct *) temp_0[0]).data = mDBadLength.HasValue()
                ? [NSData dataWithBytes:mDBadLength.Value().data() length:mDBadLength.Value().size()]
                : [[NSData alloc]
                    initWithBytes:
                        "\x17\xD0\x00\x00\xF1\xFF\x01\x00\x3D\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x2E\x20\x54\x68\x69\x73"
                        "\x20\x69\x73\x20\x61\x20\x73\x69\x6E\x67\x6C\x65\x20\x65\x6C\x65\x6D\x65\x6E\x74\x20\x6C\x69\x76\x69\x6E"
                        "\x67\x20\x61\x73\x20\x61\x20\x63\x68\x61\x72\x73\x74\x72\x69\x6E\x67\x00\xD0\x00\x00\xF1\xFF\x02\x00\x32"
                        "\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x2E\x20\x54\x68\x69\x73\x20\x69\x73\x20\x61\x20\x73\x69\x6E"
                        "\x67\x6C\x65\x20\x65\x6C\x65\x6D\x65\x6E\x74\x20\x61\x67\x61\x69\x6E\x2E\x2E\x2E\x2E\x2E\x2E\x00\x18"
                           length:129];
            ((MTRAccessControlClusterAccessControlExtensionStruct *) temp_0[0]).fabricIndex = [CurrentFabricIndex copy];

            extensionArgument = temp_0;
        }
        [cluster
            writeAttributeExtensionWithValue:extensionArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(
                                          @"TH1 writes DUT Endpoint 0 AccessControl cluster Extension attribute, value is list of "
                                          @"AccessControlExtensionStruct containing 1 element 1 .struct Data field: D_BAD_LENGTH "
                                          @":17D00000F1FF01003D48656C6C6F20576F726C642E205468697320697320612073696E676C6520656C656D"
                                          @"656E74206C6976696E6720617320612063686172737472696E6700D00000F1FF02003248656C6C6F20576F7"
                                          @"26C642E205468697320697320612073696E676C6520656C656D656E7420616761696E2E2E2E2E2E2E0018 "
                                          @"Error: %@",
                                          err);

                                      VerifyOrReturn(CheckValue("status",
                                          err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                        : EMBER_ZCL_STATUS_FAILURE)
                                              : 0,
                                          EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestTh1WritesDutEndpoint0AccessControlClusterExtensionAttributeValueIsListOfAccessControlExtensionStructContaining1Element1StructDataFieldDBadStruct1518_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id extensionArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRAccessControlClusterAccessControlExtensionStruct alloc] init];
            ((MTRAccessControlClusterAccessControlExtensionStruct *) temp_0[0]).data = mDBadStruct.HasValue()
                ? [NSData dataWithBytes:mDBadStruct.Value().data() length:mDBadStruct.Value().size()]
                : [[NSData alloc] initWithBytes:"\x15\x18" length:2];
            ((MTRAccessControlClusterAccessControlExtensionStruct *) temp_0[0]).fabricIndex = [CurrentFabricIndex copy];

            extensionArgument = temp_0;
        }
        [cluster
            writeAttributeExtensionWithValue:extensionArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"TH1 writes DUT Endpoint 0 AccessControl cluster Extension attribute, value is list "
                                            @"of AccessControlExtensionStruct containing 1 element 1. struct Data field: "
                                            @"D_BAD_STRUCT : 1518 Error: %@",
                                          err);

                                      VerifyOrReturn(CheckValue("status",
                                          err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                        : EMBER_ZCL_STATUS_FAILURE)
                                              : 0,
                                          EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestTh1WritesDutEndpoint0AccessControlClusterExtensionAttributeValueIsListOfAccessControlExtensionStructContaining1Element1StructDataFieldDBadList3701d00000f1ff01003d48656c6c6f20576f726c642e205468697320697320612073696e676c6520656c656d656e74206c6976696e6720617320612063686172737472696e670018_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id extensionArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRAccessControlClusterAccessControlExtensionStruct alloc] init];
            ((MTRAccessControlClusterAccessControlExtensionStruct *) temp_0[0]).data = mDBadList.HasValue()
                ? [NSData dataWithBytes:mDBadList.Value().data() length:mDBadList.Value().size()]
                : [[NSData alloc]
                    initWithBytes:"\x37\x01\xD0\x00\x00\xF1\xFF\x01\x00\x3D\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x2E\x20\x54"
                                  "\x68\x69\x73\x20\x69\x73\x20\x61\x20\x73\x69\x6E\x67\x6C\x65\x20\x65\x6C\x65\x6D\x65\x6E\x74\x20"
                                  "\x6C\x69\x76\x69\x6E\x67\x20\x61\x73\x20\x61\x20\x63\x68\x61\x72\x73\x74\x72\x69\x6E\x67\x00\x18"
                           length:72];
            ((MTRAccessControlClusterAccessControlExtensionStruct *) temp_0[0]).fabricIndex = [CurrentFabricIndex copy];

            extensionArgument = temp_0;
        }
        [cluster
            writeAttributeExtensionWithValue:extensionArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(
                                          @"TH1 writes DUT Endpoint 0 AccessControl cluster Extension attribute, value is list of "
                                          @"AccessControlExtensionStruct containing 1 element 1. struct Data field: D_BAD_LIST "
                                          @":3701D00000F1FF01003D48656C6C6F20576F726C642E205468697320697320612073696E676C6520656C65"
                                          @"6D656E74206C6976696E6720617320612063686172737472696E670018 Error: %@",
                                          err);

                                      VerifyOrReturn(CheckValue("status",
                                          err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                        : EMBER_ZCL_STATUS_FAILURE)
                                              : 0,
                                          EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestTh1WritesDutEndpoint0AccessControlClusterExtensionAttributeValueIsListOfAccessControlExtensionStructContaining1Element1StructDataFieldDBadElem17103d48656c6c6f20576f726c642e205468697320697320612073696e676c6520656c656d656e74206c6976696e6720617320612063686172737472696e670018_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id extensionArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRAccessControlClusterAccessControlExtensionStruct alloc] init];
            ((MTRAccessControlClusterAccessControlExtensionStruct *) temp_0[0]).data = mDBadElem.HasValue()
                ? [NSData dataWithBytes:mDBadElem.Value().data() length:mDBadElem.Value().size()]
                : [[NSData alloc]
                    initWithBytes:"\x17\x10\x3D\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x2E\x20\x54\x68\x69\x73\x20\x69\x73\x20"
                                  "\x61\x20\x73\x69\x6E\x67\x6C\x65\x20\x65\x6C\x65\x6D\x65\x6E\x74\x20\x6C\x69\x76\x69\x6E\x67\x20"
                                  "\x61\x73\x20\x61\x20\x63\x68\x61\x72\x73\x74\x72\x69\x6E\x67\x00\x18"
                           length:65];
            ((MTRAccessControlClusterAccessControlExtensionStruct *) temp_0[0]).fabricIndex = [CurrentFabricIndex copy];

            extensionArgument = temp_0;
        }
        [cluster
            writeAttributeExtensionWithValue:extensionArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(
                                          @"TH1 writes DUT Endpoint 0 AccessControl cluster Extension attribute, value is list of "
                                          @"AccessControlExtensionStruct containing 1 element 1. struct Data field: D_BAD_ELEM "
                                          @":17103D48656C6C6F20576F726C642E205468697320697320612073696E676C6520656C656D656E74206C69"
                                          @"76696E6720617320612063686172737472696E670018 Error: %@",
                                          err);

                                      VerifyOrReturn(CheckValue("status",
                                          err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                        : EMBER_ZCL_STATUS_FAILURE)
                                              : 0,
                                          EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestTh1WritesDutEndpoint0AccessControlClusterExtensionAttributeValueIsListOfAccessControlExtensionStructContaining1Element1structDataFieldDBadOverflow17d00000f1ff01003d48656c6c6f20576f726c642e205468697320697320612073696e676c6520656c656d656e74206c6976696e6720617320612063686172737472696e670018ff_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id extensionArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRAccessControlClusterAccessControlExtensionStruct alloc] init];
            ((MTRAccessControlClusterAccessControlExtensionStruct *) temp_0[0]).data = mDBadOverflow.HasValue()
                ? [NSData dataWithBytes:mDBadOverflow.Value().data() length:mDBadOverflow.Value().size()]
                : [[NSData alloc]
                    initWithBytes:"\x17\xD0\x00\x00\xF1\xFF\x01\x00\x3D\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x2E\x20\x54\x68"
                                  "\x69\x73\x20\x69\x73\x20\x61\x20\x73\x69\x6E\x67\x6C\x65\x20\x65\x6C\x65\x6D\x65\x6E\x74\x20\x6C"
                                  "\x69\x76\x69\x6E\x67\x20\x61\x73\x20\x61\x20\x63\x68\x61\x72\x73\x74\x72\x69\x6E\x67\x00\x18\xFF"
                           length:72];
            ((MTRAccessControlClusterAccessControlExtensionStruct *) temp_0[0]).fabricIndex = [CurrentFabricIndex copy];

            extensionArgument = temp_0;
        }
        [cluster
            writeAttributeExtensionWithValue:extensionArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"TH1 writes DUT Endpoint 0 AccessControl cluster Extension attribute, value is list "
                                            @"of AccessControlExtensionStruct containing 1 element 1 .struct Data field: "
                                            @"D_BAD_OVERFLOW : "
                                            @"17D00000F1FF01003D48656C6C6F20576F726C642E205468697320697320612073696E676C6520656C656"
                                            @"D656E74206C6976696E6720617320612063686172737472696E670018FF Error: %@",
                                          err);

                                      VerifyOrReturn(CheckValue("status",
                                          err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                        : EMBER_ZCL_STATUS_FAILURE)
                                              : 0,
                                          EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestTh1WritesDutEndpoint0AccessControlClusterExtensionAttributeValueIsListOfAccessControlExtensionStructContaining1Element1StructDataFieldDBadUnderflow17d00000f1ff01003d48656c6c6f20576f726c642e205468697320697320612073696e676c6520656c656d656e74206c6976696e6720617320612063686172737472696e6700_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id extensionArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRAccessControlClusterAccessControlExtensionStruct alloc] init];
            ((MTRAccessControlClusterAccessControlExtensionStruct *) temp_0[0]).data = mDBadUnderflow.HasValue()
                ? [NSData dataWithBytes:mDBadUnderflow.Value().data() length:mDBadUnderflow.Value().size()]
                : [[NSData alloc]
                    initWithBytes:"\x17\xD0\x00\x00\xF1\xFF\x01\x00\x3D\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x2E\x20\x54\x68"
                                  "\x69\x73\x20\x69\x73\x20\x61\x20\x73\x69\x6E\x67\x6C\x65\x20\x65\x6C\x65\x6D\x65\x6E\x74\x20\x6C"
                                  "\x69\x76\x69\x6E\x67\x20\x61\x73\x20\x61\x20\x63\x68\x61\x72\x73\x74\x72\x69\x6E\x67\x00"
                           length:70];
            ((MTRAccessControlClusterAccessControlExtensionStruct *) temp_0[0]).fabricIndex = [CurrentFabricIndex copy];

            extensionArgument = temp_0;
        }
        [cluster
            writeAttributeExtensionWithValue:extensionArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"TH1 writes DUT Endpoint 0 AccessControl cluster Extension attribute, value is list "
                                            @"of AccessControlExtensionStruct containing 1 element 1. struct Data field: "
                                            @"D_BAD_UNDERFLOW "
                                            @":17D00000F1FF01003D48656C6C6F20576F726C642E205468697320697320612073696E676C6520656C65"
                                            @"6D656E74206C6976696E6720617320612063686172737472696E6700 Error: %@",
                                          err);

                                      VerifyOrReturn(CheckValue("status",
                                          err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                        : EMBER_ZCL_STATUS_FAILURE)
                                              : 0,
                                          EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestTh1WritesDutEndpoint0AccessControlClusterExtensionAttributeValueIsListOfAccessControlExtensionStructContaining1Element1structDataFieldDBadNone_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id extensionArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRAccessControlClusterAccessControlExtensionStruct alloc] init];
            ((MTRAccessControlClusterAccessControlExtensionStruct *) temp_0[0]).data = mDBadNone.HasValue()
                ? [NSData dataWithBytes:mDBadNone.Value().data() length:mDBadNone.Value().size()]
                : [[NSData alloc] initWithBytes:"" length:0];
            ((MTRAccessControlClusterAccessControlExtensionStruct *) temp_0[0]).fabricIndex = [CurrentFabricIndex copy];

            extensionArgument = temp_0;
        }
        [cluster
            writeAttributeExtensionWithValue:extensionArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"TH1 writes DUT Endpoint 0 AccessControl cluster Extension attribute, value is list "
                                            @"of AccessControlExtensionStruct containing 1 element 1.struct Data field: D_BAD_NONE "
                                            @"Error: %@",
                                          err);

                                      VerifyOrReturn(CheckValue("status",
                                          err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                        : EMBER_ZCL_STATUS_FAILURE)
                                              : 0,
                                          EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestTh1WritesDutEndpoint0AccessControlClusterExtensionAttributeValueIsListOfAccessControlExtensionStructContaining2ElementsValueIsListOfAccessControlExtensionStructContaining2ElementsFirstElementContainsDataFieldDOkEmpty1718SecondElementContainsDataFieldDOkSingle17d00000f1ff01003d48656c6c6f20576f726c642e205468697320697320612073696e676c6520656c656d656e74206c6976696e6720617320612063686172737472696e670018_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id extensionArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRAccessControlClusterAccessControlExtensionStruct alloc] init];
            ((MTRAccessControlClusterAccessControlExtensionStruct *) temp_0[0]).data = mDOkEmpty.HasValue()
                ? [NSData dataWithBytes:mDOkEmpty.Value().data() length:mDOkEmpty.Value().size()]
                : [[NSData alloc] initWithBytes:"\x17\x18" length:2];
            ((MTRAccessControlClusterAccessControlExtensionStruct *) temp_0[0]).fabricIndex = [CurrentFabricIndex copy];

            temp_0[1] = [[MTRAccessControlClusterAccessControlExtensionStruct alloc] init];
            ((MTRAccessControlClusterAccessControlExtensionStruct *) temp_0[1]).data = mDOkSingle.HasValue()
                ? [NSData dataWithBytes:mDOkSingle.Value().data() length:mDOkSingle.Value().size()]
                : [[NSData alloc]
                    initWithBytes:"\x17\xD0\x00\x00\xF1\xFF\x01\x00\x3D\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x2E\x20\x54\x68"
                                  "\x69\x73\x20\x69\x73\x20\x61\x20\x73\x69\x6E\x67\x6C\x65\x20\x65\x6C\x65\x6D\x65\x6E\x74\x20\x6C"
                                  "\x69\x76\x69\x6E\x67\x20\x61\x73\x20\x61\x20\x63\x68\x61\x72\x73\x74\x72\x69\x6E\x67\x00\x18"
                           length:71];
            ((MTRAccessControlClusterAccessControlExtensionStruct *) temp_0[1]).fabricIndex = [CurrentFabricIndex copy];

            extensionArgument = temp_0;
        }
        [cluster
            writeAttributeExtensionWithValue:extensionArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"TH1 writes DUT Endpoint 0 AccessControl cluster Extension attribute, value is list "
                                            @"of AccessControlExtensionStruct containing 2 elements . value is list of "
                                            @"AccessControlExtensionStruct containing 2 elements . first element contains Data "
                                            @"field: D_OK_EMPTY 1718 . second element contains Data field: D_OK_SINGLE "
                                            @"17D00000F1FF01003D48656C6C6F20576F726C642E205468697320697320612073696E676C6520656C656"
                                            @"D656E74206C6976696E6720617320612063686172737472696E670018 Error: %@",
                                          err);

                                      VerifyOrReturn(CheckValue("status",
                                          err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                        : EMBER_ZCL_STATUS_FAILURE)
                                              : 0,
                                          EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTh1ReadsDutEndpoint0AccessControlClusterExtensionAttribute_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRReadParams alloc] init];
        params.filterByFabric = true;
        [cluster
            readAttributeExtensionWithParams:params
                                  completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                      NSLog(@"TH1 reads DUT Endpoint 0 AccessControl cluster Extension attribute Error: %@", err);

                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                      {
                                          id actualValue = value;
                                          VerifyOrReturn(CheckValue("Extension", [actualValue count], static_cast<uint32_t>(1)));
                                          VerifyOrReturn(CheckValueAsString(
                                              "Data", ((MTRAccessControlClusterAccessControlExtensionStruct *) actualValue[0]).data,
                                              mDOkEmpty.HasValue() ? [NSData dataWithBytes:mDOkEmpty.Value().data()
                                                                                    length:mDOkEmpty.Value().size()]
                                                                   : [[NSData alloc] initWithBytes:"\x17\x18" length:2]

                                              ));
                                          VerifyOrReturn(CheckValue("FabricIndex",
                                              ((MTRAccessControlClusterAccessControlExtensionStruct *) actualValue[0]).fabricIndex,
                                              CurrentFabricIndex));
                                      }

                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTh1WritesDutEndpoint0AccessControlClusterExtensionAttributeValueIsAnEmptyList_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id extensionArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            extensionArgument = temp_0;
        }
        [cluster writeAttributeExtensionWithValue:extensionArgument
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(@"TH1 writes DUT Endpoint 0 AccessControl cluster Extension attribute, value is "
                                                 @"an empty list Error: %@",
                                               err);

                                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTh1ReadsDutEndpoint0AccessControlClusterExtensionAttribute_19()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRReadParams alloc] init];
        params.filterByFabric = true;
        [cluster
            readAttributeExtensionWithParams:params
                                  completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                      NSLog(@"TH1 reads DUT Endpoint 0 AccessControl cluster Extension attribute Error: %@", err);

                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                      {
                                          id actualValue = value;
                                          VerifyOrReturn(CheckValue("Extension", [actualValue count], static_cast<uint32_t>(0)));
                                      }

                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_BOOL_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_BOOL_1_1()
        : TestCommandBridge("Test_TC_BOOL_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_BOOL_1_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_BOOL_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_BOOL_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_5();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 6;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_BOOL_2_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_BOOL_2_1()
        : TestCommandBridge("Test_TC_BOOL_2_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_BOOL_2_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_BOOL_2_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_BOOL_2_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read mandatory non-global attribute: StateValue\n");
            if (ShouldSkip("BOOL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadMandatoryNonGlobalAttributeStateValue_1();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 2;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadMandatoryNonGlobalAttributeStateValue_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeStateValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read mandatory non-global attribute: StateValue Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("stateValue", "boolean", "boolean"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_BRBINFO_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_BRBINFO_1_1()
        : TestCommandBridge("Test_TC_BRBINFO_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_BRBINFO_1_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_BRBINFO_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_BRBINFO_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads the ClusterRevision from DUT\n");
            err = TestThReadsTheClusterRevisionFromDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads the FeatureMap from DUT\n");
            err = TestThReadsTheFeatureMapFromDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : TH reads AttributeList from DUT\n");
            err = TestThReadsAttributeListFromDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH reads optional attribute(VendorName) in AttributeList\n");
            if (ShouldSkip("BRBINFO.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeVendorNameInAttributeList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH reads optional attribute(VendorID) in AttributeList\n");
            if (ShouldSkip("BRBINFO.S.A0002")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeVendorIDInAttributeList_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : TH reads optional attribute(ProductName) in AttributeList\n");
            if (ShouldSkip("BRBINFO.S.A0003")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeProductNameInAttributeList_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH reads optional attribute(NodeLabel) in AttributeList\n");
            if (ShouldSkip("BRBINFO.S.A0005")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeNodeLabelInAttributeList_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : TH reads optional attribute(HardwareVersion) in AttributeList\n");
            if (ShouldSkip("BRBINFO.S.A0007")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeHardwareVersionInAttributeList_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH reads optional attribute(HardwareVersionString) in AttributeList\n");
            if (ShouldSkip("BRBINFO.S.A0008")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeHardwareVersionStringInAttributeList_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : TH reads optional attribute(SoftwareVersion) in AttributeList\n");
            if (ShouldSkip("BRBINFO.S.A0009")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeSoftwareVersionInAttributeList_10();
            break;
        case 11:
            ChipLogProgress(
                chipTool, " ***** Test Step 11 : TH reads optional attribute(SoftwareVersionString) in AttributeList\n");
            if (ShouldSkip("BRBINFO.S.A000a")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeSoftwareVersionStringInAttributeList_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : TH reads optional attribute(ManufacturingDate) in AttributeList\n");
            if (ShouldSkip("BRBINFO.S.A000b")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeManufacturingDateInAttributeList_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : TH reads optional attribute(PartNumber) in AttributeList\n");
            if (ShouldSkip("BRBINFO.S.A000c")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributePartNumberInAttributeList_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : TH reads optional attribute(ProductURL) in AttributeList\n");
            if (ShouldSkip("BRBINFO.S.A000d")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeProductURLInAttributeList_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : TH reads optional attribute(ProductLabel) in AttributeList\n");
            if (ShouldSkip("BRBINFO.S.A000e")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeProductLabelInAttributeList_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : TH reads optional attribute(SerialNumber) in AttributeList\n");
            if (ShouldSkip("BRBINFO.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeSerialNumberInAttributeList_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : TH reads optional attribute(UniqueID) in AttributeList\n");
            if (ShouldSkip("BRBINFO.S.A0012")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeUniqueIDInAttributeList_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : TH1 reads AcceptedCommandList from DUT\n");
            err = TestTh1ReadsAcceptedCommandListFromDut_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : TH1 reads GeneratedCommandList from DUT\n");
            err = TestTh1ReadsGeneratedCommandListFromDut_19();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 20;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheClusterRevisionFromDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasicInformation alloc] initWithDevice:device
                                                                                         endpointID:@(3)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the ClusterRevision from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheFeatureMapFromDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasicInformation alloc] initWithDevice:device
                                                                                         endpointID:@(3)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the FeatureMap from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAttributeListFromDut_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasicInformation alloc] initWithDevice:device
                                                                                         endpointID:@(3)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AttributeList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 17UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeVendorNameInAttributeList_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasicInformation alloc] initWithDevice:device
                                                                                         endpointID:@(3)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(VendorName) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeVendorIDInAttributeList_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasicInformation alloc] initWithDevice:device
                                                                                         endpointID:@(3)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(VendorID) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeProductNameInAttributeList_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasicInformation alloc] initWithDevice:device
                                                                                         endpointID:@(3)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(ProductName) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeNodeLabelInAttributeList_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasicInformation alloc] initWithDevice:device
                                                                                         endpointID:@(3)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(NodeLabel) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 5UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeHardwareVersionInAttributeList_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasicInformation alloc] initWithDevice:device
                                                                                         endpointID:@(3)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(HardwareVersion) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 7UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeHardwareVersionStringInAttributeList_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasicInformation alloc] initWithDevice:device
                                                                                         endpointID:@(3)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(HardwareVersionString) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 8UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeSoftwareVersionInAttributeList_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasicInformation alloc] initWithDevice:device
                                                                                         endpointID:@(3)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(SoftwareVersion) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 9UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeSoftwareVersionStringInAttributeList_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasicInformation alloc] initWithDevice:device
                                                                                         endpointID:@(3)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(SoftwareVersionString) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 10UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeManufacturingDateInAttributeList_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasicInformation alloc] initWithDevice:device
                                                                                         endpointID:@(3)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(ManufacturingDate) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 11UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributePartNumberInAttributeList_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasicInformation alloc] initWithDevice:device
                                                                                         endpointID:@(3)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(PartNumber) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 12UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeProductURLInAttributeList_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasicInformation alloc] initWithDevice:device
                                                                                         endpointID:@(3)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(ProductURL) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 13UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeProductLabelInAttributeList_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasicInformation alloc] initWithDevice:device
                                                                                         endpointID:@(3)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(ProductLabel) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 14UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeSerialNumberInAttributeList_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasicInformation alloc] initWithDevice:device
                                                                                         endpointID:@(3)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(SerialNumber) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 15UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeUniqueIDInAttributeList_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasicInformation alloc] initWithDevice:device
                                                                                         endpointID:@(3)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(UniqueID) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 18UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTh1ReadsAcceptedCommandListFromDut_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasicInformation alloc] initWithDevice:device
                                                                                         endpointID:@(3)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH1 reads AcceptedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTh1ReadsGeneratedCommandListFromDut_19()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasicInformation alloc] initWithDevice:device
                                                                                         endpointID:@(3)
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH1 reads GeneratedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_ACT_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_ACT_1_1()
        : TestCommandBridge("Test_TC_ACT_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_ACT_1_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_ACT_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_ACT_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the optional attribute(SetupURL) in AttributeList\n");
            if (ShouldSkip("ACT.S.A0002")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeSetupURLInAttributeList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_6();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 7;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeSetupURLInAttributeList_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(SetupURL) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintMaxLength("acceptedCommandList", value, 11));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_BIND_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_BIND_1_1()
        : TestCommandBridge("Test_TC_BIND_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_BIND_1_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_BIND_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_BIND_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads the ClusterRevision from DUT\n");
            err = TestThReadsTheClusterRevisionFromDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads the FeatureMap from DUT\n");
            err = TestThReadsTheFeatureMapFromDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : TH reads AttributeList from DUT\n");
            err = TestThReadsAttributeListFromDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH reads AcceptedCommandList from DUT\n");
            err = TestThReadsAcceptedCommandListFromDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH reads GeneratedCommandList from DUT\n");
            err = TestThReadsGeneratedCommandListFromDut_5();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 6;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheClusterRevisionFromDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the ClusterRevision from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheFeatureMapFromDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the FeatureMap from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAttributeListFromDut_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AttributeList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAcceptedCommandListFromDut_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AcceptedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsGeneratedCommandListFromDut_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads GeneratedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_CC_1_1()
        : TestCommandBridge("Test_TC_CC_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_CC_1_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_CC_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_CC_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            if (ShouldSkip("( !CC.S.F00 && !CC.S.F01 && !CC.S.F02 && !CC.S.F03 && !CC.S.F04 )")) {
                NextTest();
                return;
            }
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Given CC.S.F00(HS) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("CC.S.F00")) {
                NextTest();
                return;
            }
            err = TestGivenCcsf00hsEnsureFeaturemapHasTheCorrectBitSet_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Given CC.S.F01(EHue) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("CC.S.F01")) {
                NextTest();
                return;
            }
            err = TestGivenCCSF01EHueEnsureFeaturemapHasTheCorrectBitSet_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Given CC.S.F02(CL) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("CC.S.F02")) {
                NextTest();
                return;
            }
            err = TestGivenCcsf02clEnsureFeaturemapHasTheCorrectBitSet_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Given CC.S.F03(XY) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("CC.S.F03")) {
                NextTest();
                return;
            }
            err = TestGivenCcsf03xyEnsureFeaturemapHasTheCorrectBitSet_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Given CC.S.F04(CT) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("CC.S.F04")) {
                NextTest();
                return;
            }
            err = TestGivenCcsf04ctEnsureFeaturemapHasTheCorrectBitSet_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Read the optional attribute(CurrentHue) in AttributeList\n");
            if (ShouldSkip("CC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeCurrentHueInAttributeList_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Read the optional attribute(CurrentSaturation) in AttributeList\n");
            if (ShouldSkip("CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeCurrentSaturationInAttributeList_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Read the optional attribute(RemainingTime) in AttributeList\n");
            if (ShouldSkip("CC.S.A0002")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeRemainingTimeInAttributeList_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Read the optional attribute(CurrentX) in AttributeList\n");
            if (ShouldSkip("CC.S.A0003")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeCurrentXInAttributeList_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Read the optional attribute(CurrentY) in AttributeList\n");
            if (ShouldSkip("CC.S.A0004")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeCurrentYInAttributeList_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Read the optional attribute(DriftCompensation) in AttributeList\n");
            if (ShouldSkip("CC.S.A0005")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeDriftCompensationInAttributeList_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Read the optional attribute(CompensationText) in AttributeList\n");
            if (ShouldSkip("CC.S.A0006")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeCompensationTextInAttributeList_15();
            break;
        case 16:
            ChipLogProgress(
                chipTool, " ***** Test Step 16 : Read the optional attribute(ColorTemperatureMireds) in AttributeList\n");
            if (ShouldSkip("CC.S.A0007")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeColorTemperatureMiredsInAttributeList_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Read the optional attribute(EnhancedCurrentHue) in AttributeList\n");
            if (ShouldSkip("CC.S.A4000")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeEnhancedCurrentHueInAttributeList_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Read the optional attribute(ColorLoopActive) in AttributeList\n");
            if (ShouldSkip("CC.S.A4002")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeColorLoopActiveInAttributeList_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Read the optional attribute(ColorLoopDirection) in AttributeList\n");
            if (ShouldSkip("CC.S.A4003")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeColorLoopDirectionInAttributeList_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Read the optional attribute(ColorLoopTime) in AttributeList\n");
            if (ShouldSkip("CC.S.A4004")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeColorLoopTimeInAttributeList_20();
            break;
        case 21:
            ChipLogProgress(
                chipTool, " ***** Test Step 21 : Read the optional attribute(ColorLoopStartEnhancedHue) in AttributeList\n");
            if (ShouldSkip("CC.S.A4005")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeColorLoopStartEnhancedHueInAttributeList_21();
            break;
        case 22:
            ChipLogProgress(
                chipTool, " ***** Test Step 22 : Read the optional attribute(ColorLoopStoredEnhancedHue) in AttributeList\n");
            if (ShouldSkip("CC.S.A4006")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeColorLoopStoredEnhancedHueInAttributeList_22();
            break;
        case 23:
            ChipLogProgress(
                chipTool, " ***** Test Step 23 : Read the optional attribute(ColorTempPhysicalMinMireds) in AttributeList\n");
            if (ShouldSkip("CC.S.A400b")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeColorTempPhysicalMinMiredsInAttributeList_23();
            break;
        case 24:
            ChipLogProgress(
                chipTool, " ***** Test Step 24 : Read the optional attribute(ColorTempPhysicalMaxMireds) in AttributeList\n");
            if (ShouldSkip("CC.S.A400c")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeColorTempPhysicalMaxMiredsInAttributeList_24();
            break;
        case 25:
            ChipLogProgress(
                chipTool, " ***** Test Step 25 : Read the optional attribute(CoupleColorTempToLevelMinMireds) in AttributeList\n");
            if (ShouldSkip("CC.S.A400d")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeCoupleColorTempToLevelMinMiredsInAttributeList_25();
            break;
        case 26:
            ChipLogProgress(
                chipTool, " ***** Test Step 26 : Read the optional attribute(StartUpColorTemperatureMireds) in AttributeList\n");
            if (ShouldSkip("CC.S.A4010")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeStartUpColorTemperatureMiredsInAttributeList_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : Read the optional command(MoveToHue) in AcceptedCommandList\n");
            if (ShouldSkip("CC.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandMoveToHueInAcceptedCommandList_27();
            break;
        case 28:
            ChipLogProgress(chipTool, " ***** Test Step 28 : Read the optional command(MoveHue) in AcceptedCommandList\n");
            if (ShouldSkip("CC.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandMoveHueInAcceptedCommandList_28();
            break;
        case 29:
            ChipLogProgress(chipTool, " ***** Test Step 29 : Read the optional command(StepHue) in AcceptedCommandList\n");
            if (ShouldSkip("CC.S.C02.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandStepHueInAcceptedCommandList_29();
            break;
        case 30:
            ChipLogProgress(chipTool, " ***** Test Step 30 : Read the optional command(MoveToSaturation) in AcceptedCommandList\n");
            if (ShouldSkip("CC.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandMoveToSaturationInAcceptedCommandList_30();
            break;
        case 31:
            ChipLogProgress(chipTool, " ***** Test Step 31 : Read the optional command(MoveSaturation) in AcceptedCommandList\n");
            if (ShouldSkip("CC.S.C04.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandMoveSaturationInAcceptedCommandList_31();
            break;
        case 32:
            ChipLogProgress(chipTool, " ***** Test Step 32 : Read the optional command(StepSaturation) in AcceptedCommandList\n");
            if (ShouldSkip("CC.S.C05.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandStepSaturationInAcceptedCommandList_32();
            break;
        case 33:
            ChipLogProgress(
                chipTool, " ***** Test Step 33 : Read the optional command(MoveToHueAndSaturation) in AcceptedCommandList\n");
            if (ShouldSkip("CC.S.C06.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandMoveToHueAndSaturationInAcceptedCommandList_33();
            break;
        case 34:
            ChipLogProgress(chipTool, " ***** Test Step 34 : Read the optional command(MoveToColor) in AcceptedCommandList\n");
            if (ShouldSkip("CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandMoveToColorInAcceptedCommandList_34();
            break;
        case 35:
            ChipLogProgress(chipTool, " ***** Test Step 35 : Read the optional command(MoveColor) in AcceptedCommandList\n");
            if (ShouldSkip("CC.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandMoveColorInAcceptedCommandList_35();
            break;
        case 36:
            ChipLogProgress(chipTool, " ***** Test Step 36 : Read the optional command(StepColor) in AcceptedCommandList\n");
            if (ShouldSkip("CC.S.C09.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandStepColorInAcceptedCommandList_36();
            break;
        case 37:
            ChipLogProgress(
                chipTool, " ***** Test Step 37 : Read the optional command(MoveToColorTemperature) in AcceptedCommandList\n");
            if (ShouldSkip("CC.S.C0a.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandMoveToColorTemperatureInAcceptedCommandList_37();
            break;
        case 38:
            ChipLogProgress(
                chipTool, " ***** Test Step 38 : Read the optional command(EnhancedMoveToHue) in AcceptedCommandList\n");
            if (ShouldSkip("CC.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandEnhancedMoveToHueInAcceptedCommandList_38();
            break;
        case 39:
            ChipLogProgress(chipTool, " ***** Test Step 39 : Read the optional command(EnhancedMoveHue) in AcceptedCommandList\n");
            if (ShouldSkip("CC.S.C41.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandEnhancedMoveHueInAcceptedCommandList_39();
            break;
        case 40:
            ChipLogProgress(chipTool, " ***** Test Step 40 : Read the optional command(EnhancedStepHue) in AcceptedCommandList\n");
            if (ShouldSkip("CC.S.C42.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandEnhancedStepHueInAcceptedCommandList_40();
            break;
        case 41:
            ChipLogProgress(chipTool,
                " ***** Test Step 41 : Read the optional command(EnhancedMoveToHueAndSaturation) in AcceptedCommandList\n");
            if (ShouldSkip("CC.S.C43.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandEnhancedMoveToHueAndSaturationInAcceptedCommandList_41();
            break;
        case 42:
            ChipLogProgress(chipTool, " ***** Test Step 42 : Read the optional command(ColorLoopSet) in AcceptedCommandList\n");
            if (ShouldSkip("CC.S.C44.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandColorLoopSetInAcceptedCommandList_42();
            break;
        case 43:
            ChipLogProgress(chipTool, " ***** Test Step 43 : Read the optional command(StopMoveStep) in AcceptedCommandList\n");
            if (ShouldSkip("CC.S.C47.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandStopMoveStepInAcceptedCommandList_43();
            break;
        case 44:
            ChipLogProgress(
                chipTool, " ***** Test Step 44 : Read the optional command(MoveColorTemperature) in AcceptedCommandList\n");
            if (ShouldSkip("CC.S.C4b.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandMoveColorTemperatureInAcceptedCommandList_44();
            break;
        case 45:
            ChipLogProgress(
                chipTool, " ***** Test Step 45 : Read the optional command(StepColorTemperature) in AcceptedCommandList\n");
            if (ShouldSkip("CC.S.C4c.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandStepColorTemperatureInAcceptedCommandList_45();
            break;
        case 46:
            ChipLogProgress(chipTool, " ***** Test Step 46 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_46();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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));
            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));
            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));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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));
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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));
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 46:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 47;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 5U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenCcsf00hsEnsureFeaturemapHasTheCorrectBitSet_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given CC.S.F00(HS) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenCCSF01EHueEnsureFeaturemapHasTheCorrectBitSet_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given CC.S.F01(EHue) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenCcsf02clEnsureFeaturemapHasTheCorrectBitSet_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given CC.S.F02(CL) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenCcsf03xyEnsureFeaturemapHasTheCorrectBitSet_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given CC.S.F03(XY) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenCcsf04ctEnsureFeaturemapHasTheCorrectBitSet_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given CC.S.F04(CT) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 8UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 15UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 16385UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 16394UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeCurrentHueInAttributeList_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(CurrentHue) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeCurrentSaturationInAttributeList_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(CurrentSaturation) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeRemainingTimeInAttributeList_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(RemainingTime) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeCurrentXInAttributeList_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(CurrentX) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeCurrentYInAttributeList_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(CurrentY) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 4UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeDriftCompensationInAttributeList_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(DriftCompensation) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 5UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeCompensationTextInAttributeList_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(CompensationText) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 6UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeColorTemperatureMiredsInAttributeList_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(ColorTemperatureMireds) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 7UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeEnhancedCurrentHueInAttributeList_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(EnhancedCurrentHue) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 16384UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeColorLoopActiveInAttributeList_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(ColorLoopActive) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 16386UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeColorLoopDirectionInAttributeList_19()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(ColorLoopDirection) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 16387UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeColorLoopTimeInAttributeList_20()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(ColorLoopTime) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 16388UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeColorLoopStartEnhancedHueInAttributeList_21()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(ColorLoopStartEnhancedHue) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 16389UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeColorLoopStoredEnhancedHueInAttributeList_22()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(ColorLoopStoredEnhancedHue) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 16390UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeColorTempPhysicalMinMiredsInAttributeList_23()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(ColorTempPhysicalMinMireds) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 16395UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeColorTempPhysicalMaxMiredsInAttributeList_24()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(ColorTempPhysicalMaxMireds) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 16396UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeCoupleColorTempToLevelMinMiredsInAttributeList_25()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(CoupleColorTempToLevelMinMireds) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 16397UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeStartUpColorTemperatureMiredsInAttributeList_26()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(StartUpColorTemperatureMireds) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 16400UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalCommandMoveToHueInAcceptedCommandList_27()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional command(MoveToHue) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalCommandMoveHueInAcceptedCommandList_28()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional command(MoveHue) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 1UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalCommandStepHueInAcceptedCommandList_29()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional command(StepHue) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 2UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalCommandMoveToSaturationInAcceptedCommandList_30()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional command(MoveToSaturation) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalCommandMoveSaturationInAcceptedCommandList_31()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional command(MoveSaturation) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 4UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalCommandStepSaturationInAcceptedCommandList_32()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional command(StepSaturation) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 5UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalCommandMoveToHueAndSaturationInAcceptedCommandList_33()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional command(MoveToHueAndSaturation) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 6UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalCommandMoveToColorInAcceptedCommandList_34()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional command(MoveToColor) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 7UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalCommandMoveColorInAcceptedCommandList_35()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional command(MoveColor) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 8UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalCommandStepColorInAcceptedCommandList_36()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional command(StepColor) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 9UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalCommandMoveToColorTemperatureInAcceptedCommandList_37()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional command(MoveToColorTemperature) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 10UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalCommandEnhancedMoveToHueInAcceptedCommandList_38()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional command(EnhancedMoveToHue) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 64UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalCommandEnhancedMoveHueInAcceptedCommandList_39()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional command(EnhancedMoveHue) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 65UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalCommandEnhancedStepHueInAcceptedCommandList_40()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional command(EnhancedStepHue) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 66UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalCommandEnhancedMoveToHueAndSaturationInAcceptedCommandList_41()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional command(EnhancedMoveToHueAndSaturation) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 67UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalCommandColorLoopSetInAcceptedCommandList_42()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional command(ColorLoopSet) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 68UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalCommandStopMoveStepInAcceptedCommandList_43()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional command(StopMoveStep) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 71UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalCommandMoveColorTemperatureInAcceptedCommandList_44()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional command(MoveColorTemperature) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 75UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalCommandStepColorTemperatureInAcceptedCommandList_45()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional command(StepColorTemperature) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 76UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_46()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_2_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_CC_2_1()
        : TestCommandBridge("Test_TC_CC_2_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_CC_2_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_CC_2_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_CC_2_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads CurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentHueAttributeFromDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : TH reads RemainingTime attribute from DUT\n");
            if (ShouldSkip("CC.S.A0002")) {
                NextTest();
                return;
            }
            err = TestThReadsRemainingTimeAttributeFromDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH reads CurrentX attribute from DUT\n");
            if (ShouldSkip("CC.S.A0003")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentXAttributeFromDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH reads CurrentY attribute from DUT\n");
            if (ShouldSkip("CC.S.A0004")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentYAttributeFromDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : TH reads DriftCompensation attribute from DUT\n");
            if (ShouldSkip("CC.S.A0005")) {
                NextTest();
                return;
            }
            err = TestThReadsDriftCompensationAttributeFromDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH reads CompensationText attribute from DUT\n");
            if (ShouldSkip("CC.S.A0005")) {
                NextTest();
                return;
            }
            err = TestThReadsCompensationTextAttributeFromDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : TH reads ColorTemperatureMireds attribute from DUT\n");
            if (ShouldSkip("CC.S.A0007")) {
                NextTest();
                return;
            }
            err = TestThReadsColorTemperatureMiredsAttributeFromDut_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH reads ColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.A0008")) {
                NextTest();
                return;
            }
            err = TestThReadsColorModeAttributeFromDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : TH reads Options attribute from DUT\n");
            if (ShouldSkip("CC.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionsAttributeFromDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : TH reads EnhancedCurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.A4000")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedCurrentHueAttributeFromDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : TH reads EnhancedColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F02")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedColorModeAttributeFromDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : TH reads ColorLoopActive attribute from DUT\n");
            if (ShouldSkip("CC.S.A4002")) {
                NextTest();
                return;
            }
            err = TestThReadsColorLoopActiveAttributeFromDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : TH reads ColorLoopDirection attribute from DUT\n");
            if (ShouldSkip("CC.S.A4003")) {
                NextTest();
                return;
            }
            err = TestThReadsColorLoopDirectionAttributeFromDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : TH reads ColorLoopTime attribute from DUT\n");
            if (ShouldSkip("CC.S.A4004")) {
                NextTest();
                return;
            }
            err = TestThReadsColorLoopTimeAttributeFromDut_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : TH reads ColorLoopStartEnhancedHue attribute from DUT\n");
            if (ShouldSkip("CC.S.A4005")) {
                NextTest();
                return;
            }
            err = TestThReadsColorLoopStartEnhancedHueAttributeFromDut_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : TH reads ColorLoopStoredEnhancedHue attribute from DUT\n");
            if (ShouldSkip("CC.S.A4006")) {
                NextTest();
                return;
            }
            err = TestThReadsColorLoopStoredEnhancedHueAttributeFromDut_17();
            break;
        case 18:
            ChipLogProgress(
                chipTool, " ***** Test Step 18 : Saving for comparision in step 19 reads FeatureMap attribute from DUT\n");
            err = TestSavingForComparisionInStep19ReadsFeatureMapAttributeFromDut_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : TH reads ColorCapabilities attribute from DUT\n");
            if (ShouldSkip("CC.S.A400a")) {
                NextTest();
                return;
            }
            err = TestThReadsColorCapabilitiesAttributeFromDut_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : TH reads ColorTempPhysicalMinMireds attribute from DUT\n");
            if (ShouldSkip("CC.S.A400b")) {
                NextTest();
                return;
            }
            err = TestThReadsColorTempPhysicalMinMiredsAttributeFromDut_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : TH reads ColorTempPhysicalMaxMireds attribute from DUT\n");
            if (ShouldSkip("CC.S.A400c")) {
                NextTest();
                return;
            }
            err = TestThReadsColorTempPhysicalMaxMiredsAttributeFromDut_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : TH reads CoupleColorTempToLevelMinMireds attribute from DUT\n");
            if (ShouldSkip("CC.S.A400d")) {
                NextTest();
                return;
            }
            err = TestThReadsCoupleColorTempToLevelMinMiredsAttributeFromDut_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : TH reads StartUpColorTemperatureMireds attribute from DUT\n");
            if (ShouldSkip("CC.S.A4010")) {
                NextTest();
                return;
            }
            err = TestThReadsStartUpColorTemperatureMiredsAttributeFromDut_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : TH reads NumberOfPrimaries attribute from DUT\n");
            if (ShouldSkip("CC.S.A0010")) {
                NextTest();
                return;
            }
            err = TestThReadsNumberOfPrimariesAttributeFromDut_24();
            break;
        case 25:
            ChipLogProgress(chipTool,
                " ***** Test Step 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\n");
            if (ShouldSkip("PICS_USER_PROMPT && CC.S.A0011")) {
                NextTest();
                return;
            }
            err = TestThReadsPrimary1XAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs1OrMore_25();
            break;
        case 26:
            ChipLogProgress(chipTool,
                " ***** Test Step 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\n");
            if (ShouldSkip("PICS_USER_PROMPT && CC.S.A0012")) {
                NextTest();
                return;
            }
            err = TestThReadsPrimary1YAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs1OrMore_26();
            break;
        case 27:
            ChipLogProgress(chipTool,
                " ***** Test Step 27 : TH reads Primary1Intensity attribute from DUT and Verify that the DUT response contains an "
                "uint8 if NumberOfPrimaries is 1 or more\n");
            if (ShouldSkip("PICS_USER_PROMPT && CC.S.A0013")) {
                NextTest();
                return;
            }
            err = TestThReadsPrimary1IntensityAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint8IfNumberOfPrimariesIs1OrMore_27();
            break;
        case 28:
            ChipLogProgress(chipTool,
                " ***** Test Step 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\n");
            if (ShouldSkip("PICS_USER_PROMPT && CC.S.A0015")) {
                NextTest();
                return;
            }
            err = TestThReadsPrimary2XAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs2OrMore_28();
            break;
        case 29:
            ChipLogProgress(chipTool,
                " ***** Test Step 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\n");
            if (ShouldSkip("PICS_USER_PROMPT && CC.S.A0016")) {
                NextTest();
                return;
            }
            err = TestThReadsPrimary2YAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs2OrMore_29();
            break;
        case 30:
            ChipLogProgress(chipTool,
                " ***** Test Step 30 : TH reads Primary2Intensity attribute from DUT and Verify that the DUT response contains an "
                "uint8 if NumberOfPrimaries is 2 or more\n");
            if (ShouldSkip("PICS_USER_PROMPT && CC.S.A0017")) {
                NextTest();
                return;
            }
            err = TestThReadsPrimary2IntensityAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint8IfNumberOfPrimariesIs2OrMore_30();
            break;
        case 31:
            ChipLogProgress(chipTool,
                " ***** Test Step 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\n");
            if (ShouldSkip("PICS_USER_PROMPT && CC.S.A0019")) {
                NextTest();
                return;
            }
            err = TestThReadsPrimary3XAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs3OrMore_31();
            break;
        case 32:
            ChipLogProgress(chipTool,
                " ***** Test Step 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\n");
            if (ShouldSkip("PICS_USER_PROMPT && CC.S.A001a")) {
                NextTest();
                return;
            }
            err = TestThReadsPrimary3YAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs3OrMore_32();
            break;
        case 33:
            ChipLogProgress(chipTool,
                " ***** Test Step 33 : TH reads Primary3Intensity attribute from DUT and Verify that the DUT response contains an "
                "uint8 if NumberOfPrimaries is 3 or more\n");
            if (ShouldSkip("PICS_USER_PROMPT && CC.S.A001b")) {
                NextTest();
                return;
            }
            err = TestThReadsPrimary3IntensityAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint8IfNumberOfPrimariesIs3OrMore_33();
            break;
        case 34:
            ChipLogProgress(chipTool,
                " ***** Test Step 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\n");
            if (ShouldSkip("PICS_USER_PROMPT && CC.S.A0020")) {
                NextTest();
                return;
            }
            err = TestThReadsPrimary4XAttributeFromDutVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs4OrMore_34();
            break;
        case 35:
            ChipLogProgress(chipTool,
                " ***** Test Step 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\n");
            if (ShouldSkip("PICS_USER_PROMPT && CC.S.A0021")) {
                NextTest();
                return;
            }
            err = TestThReadsPrimary4YAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs4OrMore_35();
            break;
        case 36:
            ChipLogProgress(chipTool,
                " ***** Test Step 36 : TH reads Primary4Intensity attribute from DUT and Verify that the DUT response contains an "
                "uint8 if NumberOfPrimaries is 4 or more\n");
            if (ShouldSkip("PICS_USER_PROMPT && CC.S.A0022")) {
                NextTest();
                return;
            }
            err = TestThReadsPrimary4IntensityAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint8IfNumberOfPrimariesIs4OrMore_36();
            break;
        case 37:
            ChipLogProgress(chipTool,
                " ***** Test Step 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\n");
            if (ShouldSkip("PICS_USER_PROMPT && CC.S.A0024")) {
                NextTest();
                return;
            }
            err = TestThReadsPrimary5XAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs5OrMore_37();
            break;
        case 38:
            ChipLogProgress(chipTool,
                " ***** Test Step 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\n");
            if (ShouldSkip("PICS_USER_PROMPT && CC.S.A0025")) {
                NextTest();
                return;
            }
            err = TestThReadsPrimary5YAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs5OrMore_38();
            break;
        case 39:
            ChipLogProgress(chipTool,
                " ***** Test Step 39 : TH reads Primary5Intensity attribute from DUT and Verify that the DUT response contains an "
                "uint8 if NumberOfPrimaries is 5 or more\n");
            if (ShouldSkip("PICS_USER_PROMPT && CC.S.A0026")) {
                NextTest();
                return;
            }
            err = TestThReadsPrimary5IntensityAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint8IfNumberOfPrimariesIs5OrMore_39();
            break;
        case 40:
            ChipLogProgress(chipTool,
                " ***** Test Step 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\n");
            if (ShouldSkip("PICS_USER_PROMPT && CC.S.A0028")) {
                NextTest();
                return;
            }
            err = TestThReadsPrimary6XAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs6OrMore_40();
            break;
        case 41:
            ChipLogProgress(chipTool,
                " ***** Test Step 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\n");
            if (ShouldSkip("PICS_USER_PROMPT && CC.S.A0029")) {
                NextTest();
                return;
            }
            err = TestThReadsPrimary6YAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs6OrMore_41();
            break;
        case 42:
            ChipLogProgress(chipTool,
                " ***** Test Step 42 : TH reads Primary6Intensity attribute from DUT and Verify that the DUT response contains an "
                "uint8 if NumberOfPrimaries is 6 or more\n");
            if (ShouldSkip("PICS_USER_PROMPT && CC.S.A002a")) {
                NextTest();
                return;
            }
            err = TestThReadsPrimary6IntensityAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint8IfNumberOfPrimariesIs6OrMore_42();
            break;
        case 43:
            ChipLogProgress(chipTool, " ***** Test Step 43 : TH reads WhitePointX attribute from DUT\n");
            if (ShouldSkip("CC.S.A0030")) {
                NextTest();
                return;
            }
            err = TestThReadsWhitePointXAttributeFromDut_43();
            break;
        case 44:
            ChipLogProgress(chipTool, " ***** Test Step 44 : TH reads WhitePointY attribute from DUT\n");
            if (ShouldSkip("CC.S.A0031")) {
                NextTest();
                return;
            }
            err = TestThReadsWhitePointYAttributeFromDut_44();
            break;
        case 45:
            ChipLogProgress(chipTool, " ***** Test Step 45 : TH reads ColorPointRX attribute from DUT\n");
            if (ShouldSkip("CC.S.A0032")) {
                NextTest();
                return;
            }
            err = TestThReadsColorPointRXAttributeFromDut_45();
            break;
        case 46:
            ChipLogProgress(chipTool, " ***** Test Step 46 : TH reads ColorPointRY attribute from DUT\n");
            if (ShouldSkip("CC.S.A0033")) {
                NextTest();
                return;
            }
            err = TestThReadsColorPointRYAttributeFromDut_46();
            break;
        case 47:
            ChipLogProgress(chipTool, " ***** Test Step 47 : TH reads ColorPointRIntensity attribute from DUT\n");
            if (ShouldSkip("CC.S.A0034")) {
                NextTest();
                return;
            }
            err = TestThReadsColorPointRIntensityAttributeFromDut_47();
            break;
        case 48:
            ChipLogProgress(chipTool, " ***** Test Step 48 : TH reads ColorPointGX attribute from DUT\n");
            if (ShouldSkip("CC.S.A0036")) {
                NextTest();
                return;
            }
            err = TestThReadsColorPointGXAttributeFromDut_48();
            break;
        case 49:
            ChipLogProgress(chipTool, " ***** Test Step 49 : TH reads ColorPointGY attribute from DUT\n");
            if (ShouldSkip("CC.S.A0037")) {
                NextTest();
                return;
            }
            err = TestThReadsColorPointGYAttributeFromDut_49();
            break;
        case 50:
            ChipLogProgress(chipTool, " ***** Test Step 50 : TH reads ColorPointGIntensity attribute from DUT\n");
            if (ShouldSkip("CC.S.A0038")) {
                NextTest();
                return;
            }
            err = TestThReadsColorPointGIntensityAttributeFromDut_50();
            break;
        case 51:
            ChipLogProgress(chipTool, " ***** Test Step 51 : TH reads ColorPointBX attribute from DUT\n");
            if (ShouldSkip("CC.S.A003a")) {
                NextTest();
                return;
            }
            err = TestThReadsColorPointBXAttributeFromDut_51();
            break;
        case 52:
            ChipLogProgress(chipTool, " ***** Test Step 52 : TH reads ColorPointBY attribute from DUT\n");
            if (ShouldSkip("CC.S.A003b")) {
                NextTest();
                return;
            }
            err = TestThReadsColorPointBYAttributeFromDut_52();
            break;
        case 53:
            ChipLogProgress(chipTool, " ***** Test Step 53 : TH reads ColorPointBIntensity attribute from DUT\n");
            if (ShouldSkip("CC.S.A003c")) {
                NextTest();
                return;
            }
            err = TestThReadsColorPointBIntensityAttributeFromDut_53();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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));
            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));
            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));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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));
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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));
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 46:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 50:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 51:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 54;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentHueAttributeFromDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("currentHue", "int8u", "int8u"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentHue", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentHue", [value unsignedCharValue], 254U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("currentSaturation", "int8u", "int8u"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 254U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsRemainingTimeAttributeFromDut_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRemainingTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads RemainingTime attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("remainingTime", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("remainingTime", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("remainingTime", [value unsignedShortValue], 65534U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentXAttributeFromDut_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentX attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("currentX", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentX", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentX", [value unsignedShortValue], 65279U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentY attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("currentY", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentY", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentY", [value unsignedShortValue], 65279U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsDriftCompensationAttributeFromDut_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeDriftCompensationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads DriftCompensation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("driftCompensation", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("driftCompensation", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("driftCompensation", [value unsignedCharValue], 4U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCompensationTextAttributeFromDut_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCompensationTextWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CompensationText attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("compensationText", "char_string", "char_string"));
            VerifyOrReturn(CheckConstraintMaxLength("compensationText", value, 254));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorTemperatureMiredsAttributeFromDut_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorTemperatureMiredsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorTemperatureMireds attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("colorTemperatureMireds", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("colorTemperatureMireds", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("colorTemperatureMireds", [value unsignedShortValue], 65279U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorModeAttributeFromDut_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorMode attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("colorMode", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("colorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("colorMode", [value unsignedCharValue], 2U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionsAttributeFromDut_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOptionsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Options attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("options", "bitmap8", "bitmap8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("options", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("options", [value unsignedCharValue], 4U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsEnhancedCurrentHueAttributeFromDut_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedCurrentHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("enhancedCurrentHue", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 65535U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsEnhancedColorModeAttributeFromDut_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedColorMode attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("enhancedColorMode", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("enhancedColorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("enhancedColorMode", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorLoopActiveAttributeFromDut_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorLoopActiveWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorLoopActive attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("colorLoopActive", "int8u", "int8u"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("colorLoopActive", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("colorLoopActive", [value unsignedCharValue], 254U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorLoopDirectionAttributeFromDut_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorLoopDirectionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorLoopDirection attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("colorLoopDirection", "int8u", "int8u"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("colorLoopDirection", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("colorLoopDirection", [value unsignedCharValue], 254U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorLoopTimeAttributeFromDut_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorLoopTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorLoopTime attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("colorLoopTime", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("colorLoopTime", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("colorLoopTime", [value unsignedShortValue], 65534U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorLoopStartEnhancedHueAttributeFromDut_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorLoopStartEnhancedHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorLoopStartEnhancedHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("colorLoopStartEnhancedHue", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("colorLoopStartEnhancedHue", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("colorLoopStartEnhancedHue", [value unsignedShortValue], 65535U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorLoopStoredEnhancedHueAttributeFromDut_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorLoopStoredEnhancedHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorLoopStoredEnhancedHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("colorLoopStoredEnhancedHue", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("colorLoopStoredEnhancedHue", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("colorLoopStoredEnhancedHue", [value unsignedShortValue], 65535U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull FeatureMapValue;

    CHIP_ERROR TestSavingForComparisionInStep19ReadsFeatureMapAttributeFromDut_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Saving for comparision in step 19 reads FeatureMap attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                FeatureMapValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorCapabilitiesAttributeFromDut_19()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorCapabilitiesWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorCapabilities attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ColorCapabilities", actualValue, FeatureMapValue));
            }

            VerifyOrReturn(CheckConstraintType("colorCapabilities", "bitmap16", "bitmap16"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("colorCapabilities", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("colorCapabilities", [value unsignedShortValue], 31U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorTempPhysicalMinMiredsAttributeFromDut_20()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorTempPhysicalMinMiredsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorTempPhysicalMinMireds attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("colorTempPhysicalMinMireds", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("colorTempPhysicalMinMireds", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("colorTempPhysicalMinMireds", [value unsignedShortValue], 65279U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorTempPhysicalMaxMiredsAttributeFromDut_21()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorTempPhysicalMaxMiredsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorTempPhysicalMaxMireds attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("colorTempPhysicalMaxMireds", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("colorTempPhysicalMaxMireds", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("colorTempPhysicalMaxMireds", [value unsignedShortValue], 65279U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCoupleColorTempToLevelMinMiredsAttributeFromDut_22()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCoupleColorTempToLevelMinMiredsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CoupleColorTempToLevelMinMireds attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("coupleColorTempToLevelMinMireds", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("coupleColorTempToLevelMinMireds", [value unsignedShortValue], 0U));
            VerifyOrReturn(
                CheckConstraintMaxValue<uint16_t>("coupleColorTempToLevelMinMireds", [value unsignedShortValue], 65279U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsStartUpColorTemperatureMiredsAttributeFromDut_23()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeStartUpColorTemperatureMiredsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads StartUpColorTemperatureMireds attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("startUpColorTemperatureMireds", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("startUpColorTemperatureMireds", [value unsignedShortValue], 0U));
                VerifyOrReturn(
                    CheckConstraintMaxValue<uint16_t>("startUpColorTemperatureMireds", [value unsignedShortValue], 65279U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsNumberOfPrimariesAttributeFromDut_24()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNumberOfPrimariesWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads NumberOfPrimaries attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("numberOfPrimaries", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("numberOfPrimaries", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("numberOfPrimaries", [value unsignedCharValue], 6U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestThReadsPrimary1XAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs1OrMore_25()
    {

        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("alpha", value);
    }

    CHIP_ERROR
    TestThReadsPrimary1YAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs1OrMore_26()
    {

        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("alpha", value);
    }

    CHIP_ERROR
    TestThReadsPrimary1IntensityAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint8IfNumberOfPrimariesIs1OrMore_27()
    {

        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("alpha", value);
    }

    CHIP_ERROR
    TestThReadsPrimary2XAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs2OrMore_28()
    {

        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("alpha", value);
    }

    CHIP_ERROR
    TestThReadsPrimary2YAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs2OrMore_29()
    {

        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("alpha", value);
    }

    CHIP_ERROR
    TestThReadsPrimary2IntensityAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint8IfNumberOfPrimariesIs2OrMore_30()
    {

        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("alpha", value);
    }

    CHIP_ERROR
    TestThReadsPrimary3XAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs3OrMore_31()
    {

        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("alpha", value);
    }

    CHIP_ERROR
    TestThReadsPrimary3YAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs3OrMore_32()
    {

        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("alpha", value);
    }

    CHIP_ERROR
    TestThReadsPrimary3IntensityAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint8IfNumberOfPrimariesIs3OrMore_33()
    {

        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("alpha", value);
    }

    CHIP_ERROR
    TestThReadsPrimary4XAttributeFromDutVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs4OrMore_34()
    {

        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("alpha", value);
    }

    CHIP_ERROR
    TestThReadsPrimary4YAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs4OrMore_35()
    {

        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("alpha", value);
    }

    CHIP_ERROR
    TestThReadsPrimary4IntensityAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint8IfNumberOfPrimariesIs4OrMore_36()
    {

        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("alpha", value);
    }

    CHIP_ERROR
    TestThReadsPrimary5XAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs5OrMore_37()
    {

        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("alpha", value);
    }

    CHIP_ERROR
    TestThReadsPrimary5YAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs5OrMore_38()
    {

        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("alpha", value);
    }

    CHIP_ERROR
    TestThReadsPrimary5IntensityAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint8IfNumberOfPrimariesIs5OrMore_39()
    {

        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("alpha", value);
    }

    CHIP_ERROR
    TestThReadsPrimary6XAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs6OrMore_40()
    {

        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("alpha", value);
    }

    CHIP_ERROR
    TestThReadsPrimary6YAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs6OrMore_41()
    {

        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("alpha", value);
    }

    CHIP_ERROR
    TestThReadsPrimary6IntensityAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint8IfNumberOfPrimariesIs6OrMore_42()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestThReadsWhitePointXAttributeFromDut_43()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeWhitePointXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads WhitePointX attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("whitePointX", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("whitePointX", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("whitePointX", [value unsignedShortValue], 65279U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsWhitePointYAttributeFromDut_44()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeWhitePointYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads WhitePointY attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("whitePointY", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("whitePointY", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("whitePointY", [value unsignedShortValue], 65279U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorPointRXAttributeFromDut_45()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorPointRXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorPointRX attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("colorPointRX", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("colorPointRX", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("colorPointRX", [value unsignedShortValue], 65279U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorPointRYAttributeFromDut_46()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorPointRYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorPointRY attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("colorPointRY", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("colorPointRY", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("colorPointRY", [value unsignedShortValue], 65279U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorPointRIntensityAttributeFromDut_47()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorPointRIntensityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorPointRIntensity attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("colorPointRIntensity", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("colorPointRIntensity", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("colorPointRIntensity", [value unsignedCharValue], 255U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorPointGXAttributeFromDut_48()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorPointGXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorPointGX attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("colorPointGX", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("colorPointGX", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("colorPointGX", [value unsignedShortValue], 65279U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorPointGYAttributeFromDut_49()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorPointGYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorPointGY attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("colorPointGY", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("colorPointGY", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("colorPointGY", [value unsignedShortValue], 65279U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorPointGIntensityAttributeFromDut_50()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorPointGIntensityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorPointGIntensity attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("colorPointGIntensity", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("colorPointGIntensity", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("colorPointGIntensity", [value unsignedCharValue], 255U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorPointBXAttributeFromDut_51()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorPointBXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorPointBX attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("colorPointBX", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("colorPointBX", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("colorPointBX", [value unsignedShortValue], 65279U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorPointBYAttributeFromDut_52()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorPointBYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorPointBY attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("colorPointBY", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("colorPointBY", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("colorPointBY", [value unsignedShortValue], 65279U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorPointBIntensityAttributeFromDut_53()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorPointBIntensityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorPointBIntensity attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("colorPointBIntensity", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("colorPointBIntensity", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("colorPointBIntensity", [value unsignedCharValue], 255U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_3_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_CC_3_2()
        : TestCommandBridge("Test_TC_CC_3_2")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_CC_3_2() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_CC_3_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_CC_3_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH writes 0 to the Options attribute\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThWrites0ToTheOptionsAttribute_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH sends On command to DUT\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool,
                " ***** Test Step 3 : TH sends MoveToHue command to DUT with Hue=200, Direction=0x00 (shortest distance) and "
                "TransitionTime=0 (immediately)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToHueCommandToDutWithHue200Direction0x00ShortestDistanceAndTransitionTime0Immediately_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Wait 100ms\n");
            err = TestWait100ms_4();
            break;
        case 5:
            ChipLogProgress(
                chipTool, " ***** Test Step 5 : TH sends MoveHue command to DUT with MoveMode=0x01 (up) and Rate=5 (units/s)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveHueCommandToDutWithMoveMode0x01UpAndRate5UnitsS_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Wait 10s\n");
            err = TestWait10s_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH reads CurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentHueAttributeFromDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Wait 10s\n");
            err = TestWait10s_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH reads CurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentHueAttributeFromDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Wait 10s\n");
            err = TestWait10s_10();
            break;
        case 11:
            ChipLogProgress(
                chipTool, " ***** Test Step 11 : TH sends MoveHue command to DUT with MoveMode=0x00 (stop) and Rate=5 (units/s)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveHueCommandToDutWithMoveMode0x00StopAndRate5UnitsS_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : TH reads CurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentHueAttributeFromDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Wait 2s\n");
            err = TestWait2s_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : TH reads CurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentHueAttributeFromDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool,
                " ***** Test Step 15 : TH sends MoveToHue command to DUT with Hue=60, Direction=0x00 (shortest distance) and "
                "TransitionTime=0 (immediately)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToHueCommandToDutWithHue60Direction0x00ShortestDistanceAndTransitionTime0Immediately_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Wait 100ms\n");
            err = TestWait100ms_16();
            break;
        case 17:
            ChipLogProgress(
                chipTool, " ***** Test Step 17 : TH sends MoveHue command to DUT with MoveMode=0x03 (down) and Rate=5 (units/s)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveHueCommandToDutWithMoveMode0x03DownAndRate5UnitsS_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Wait 10s\n");
            err = TestWait10s_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : TH reads CurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentHueAttributeFromDut_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Wait 10s\n");
            err = TestWait10s_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : TH reads CurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentHueAttributeFromDut_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : Wait 10s\n");
            err = TestWait10s_22();
            break;
        case 23:
            ChipLogProgress(
                chipTool, " ***** Test Step 23 : TH sends MoveHue command to DUT with MoveMode=0x00 (stop) and Rate=5 (units/s)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveHueCommandToDutWithMoveMode0x00StopAndRate5UnitsS_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : TH reads CurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentHueAttributeFromDut_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : Wait 2s\n");
            err = TestWait2s_25();
            break;
        case 26:
            ChipLogProgress(chipTool, " ***** Test Step 26 : TH reads CurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentHueAttributeFromDut_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : TH reads ColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0008")) {
                NextTest();
                return;
            }
            err = TestThReadsColorModeAttributeFromDut_27();
            break;
        case 28:
            ChipLogProgress(chipTool, " ***** Test Step 28 : TH reads EnhancedColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A4001")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedColorModeAttributeFromDut_28();
            break;
        case 29:
            ChipLogProgress(chipTool, " ***** Test Step 29 : Turn off light that we turned on\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestTurnOffLightThatWeTurnedOn_29();
            break;
        case 30:
            ChipLogProgress(chipTool, " ***** Test Step 30 : Check on/off attribute value is false after off command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsFalseAfterOffCommand_30();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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));
            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));
            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));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 31;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThWrites0ToTheOptionsAttribute_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"TH writes 0 to the Options attribute Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOnCommandToDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends On command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToHueCommandToDutWithHue200Direction0x00ShortestDistanceAndTransitionTime0Immediately_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToHueParams alloc] init];
        params.hue = [NSNumber numberWithUnsignedChar:200U];
        params.direction = [NSNumber numberWithUnsignedChar:0U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToHueWithParams:params
                          completion:^(NSError * _Nullable err) {
                              NSLog(@"TH sends MoveToHue command to DUT with Hue=200, Direction=0x00 (shortest distance) and "
                                    @"TransitionTime=0 (immediately) Error: %@",
                                  err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_4()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThSendsMoveHueCommandToDutWithMoveMode0x01UpAndRate5UnitsS_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveHueParams alloc] init];
        params.moveMode = [NSNumber numberWithUnsignedChar:1U];
        params.rate = [NSNumber numberWithUnsignedChar:5U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveHueWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"TH sends MoveHue command to DUT with MoveMode=0x01 (up) and Rate=5 (units/s) Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_6()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentHueAttributeFromDut_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentHue", [value unsignedCharValue], 215U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentHue", [value unsignedCharValue], 255U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_8()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentHueAttributeFromDut_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentHue", [value unsignedCharValue], 38U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentHue", [value unsignedCharValue], 52U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_10()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThSendsMoveHueCommandToDutWithMoveMode0x00StopAndRate5UnitsS_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveHueParams alloc] init];
        params.moveMode = [NSNumber numberWithUnsignedChar:0U];
        params.rate = [NSNumber numberWithUnsignedChar:5U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveHueWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"TH sends MoveHue command to DUT with MoveMode=0x00 (stop) and Rate=5 (units/s) Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentHueAttributeFromDut_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentHue", [value unsignedCharValue], 80U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentHue", [value unsignedCharValue], 110U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait2s_13()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 2000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentHueAttributeFromDut_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentHue", [value unsignedCharValue], 80U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentHue", [value unsignedCharValue], 110U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToHueCommandToDutWithHue60Direction0x00ShortestDistanceAndTransitionTime0Immediately_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToHueParams alloc] init];
        params.hue = [NSNumber numberWithUnsignedChar:60U];
        params.direction = [NSNumber numberWithUnsignedChar:0U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToHueWithParams:params
                          completion:^(NSError * _Nullable err) {
                              NSLog(@"TH sends MoveToHue command to DUT with Hue=60, Direction=0x00 (shortest distance) and "
                                    @"TransitionTime=0 (immediately) Error: %@",
                                  err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_16()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThSendsMoveHueCommandToDutWithMoveMode0x03DownAndRate5UnitsS_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveHueParams alloc] init];
        params.moveMode = [NSNumber numberWithUnsignedChar:3U];
        params.rate = [NSNumber numberWithUnsignedChar:5U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveHueWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"TH sends MoveHue command to DUT with MoveMode=0x03 (down) and Rate=5 (units/s) Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_18()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentHueAttributeFromDut_19()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentHue", [value unsignedCharValue], 8U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentHue", [value unsignedCharValue], 12U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_20()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentHueAttributeFromDut_21()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentHue", [value unsignedCharValue], 183U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentHue", [value unsignedCharValue], 247U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_22()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThSendsMoveHueCommandToDutWithMoveMode0x00StopAndRate5UnitsS_23()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveHueParams alloc] init];
        params.moveMode = [NSNumber numberWithUnsignedChar:0U];
        params.rate = [NSNumber numberWithUnsignedChar:5U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveHueWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"TH sends MoveHue command to DUT with MoveMode=0x00 (stop) and Rate=5 (units/s) Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentHueAttributeFromDut_24()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentHue", [value unsignedCharValue], 140U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentHue", [value unsignedCharValue], 190U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait2s_25()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 2000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentHueAttributeFromDut_26()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentHue", [value unsignedCharValue], 140U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentHue", [value unsignedCharValue], 190U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorModeAttributeFromDut_27()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorMode attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ColorMode", actualValue, 0U));
            }

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("colorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("colorMode", [value unsignedCharValue], 2U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsEnhancedColorModeAttributeFromDut_28()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedColorMode attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("EnhancedColorMode", actualValue, 0U));
            }

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("enhancedColorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("enhancedColorMode", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTurnOffLightThatWeTurnedOn_29()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Turn off light that we turned on Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_30()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is false after off command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_3_3 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_CC_3_3()
        : TestCommandBridge("Test_TC_CC_3_3")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_CC_3_3() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_CC_3_3\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_CC_3_3\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH writes 0 to the Options attribute\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThWrites0ToTheOptionsAttribute_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH sends On command to DUT\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool,
                " ***** Test Step 3 : TH sends MoveToHue command to DUT with Hue=200, Direction=0x00 (shortest distance) and "
                "TransitionTime=0 (immediately)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToHueCommandToDutWithHue200Direction0x00ShortestDistanceAndTransitionTime0Immediately_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Wait 100ms\n");
            err = TestWait100ms_4();
            break;
        case 5:
            ChipLogProgress(chipTool,
                " ***** Test Step 5 : TH sends StepHue command to DUT with StepMode=0x01 (up), StepSize=60 and TransitionTime=200 "
                "(20s)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C02.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsStepHueCommandToDutWithStepMode0x01UpStepSize60AndTransitionTime20020s_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Wait 10s\n");
            err = TestWait10s_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH reads CurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentHueAttributeFromDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Wait 10s\n");
            err = TestWait10s_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH reads CurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentHueAttributeFromDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Wait 5s\n");
            err = TestWait5s_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : TH reads CurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentHueAttributeFromDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool,
                " ***** Test Step 12 : TH sends MoveToHue command to DUT with Hue=50, Direction=0x00 (shortest distance) and "
                "TransitionTime=0 (immediately)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToHueCommandToDutWithHue50Direction0x00ShortestDistanceAndTransitionTime0Immediately_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Wait 100ms\n");
            err = TestWait100ms_13();
            break;
        case 14:
            ChipLogProgress(chipTool,
                " ***** Test Step 14 : TH sends StepHue command to DUT with StepMode=0x03 (down), StepSize=60 and "
                "TransitionTime=200 (20s)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C02.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsStepHueCommandToDutWithStepMode0x03DownStepSize60AndTransitionTime20020s_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Wait 10s\n");
            err = TestWait10s_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : TH reads CurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentHueAttributeFromDut_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Wait 10s\n");
            err = TestWait10s_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : TH reads CurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentHueAttributeFromDut_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Wait 5s\n");
            err = TestWait5s_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : TH reads CurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentHueAttributeFromDut_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : TH reads ColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0008")) {
                NextTest();
                return;
            }
            err = TestThReadsColorModeAttributeFromDut_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : TH reads EnhancedColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A4001")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedColorModeAttributeFromDut_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : Turn off light that we turned on\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestTurnOffLightThatWeTurnedOn_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : Check on/off attribute value is false after off command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsFalseAfterOffCommand_24();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 25;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThWrites0ToTheOptionsAttribute_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"TH writes 0 to the Options attribute Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOnCommandToDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends On command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToHueCommandToDutWithHue200Direction0x00ShortestDistanceAndTransitionTime0Immediately_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToHueParams alloc] init];
        params.hue = [NSNumber numberWithUnsignedChar:200U];
        params.direction = [NSNumber numberWithUnsignedChar:0U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToHueWithParams:params
                          completion:^(NSError * _Nullable err) {
                              NSLog(@"TH sends MoveToHue command to DUT with Hue=200, Direction=0x00 (shortest distance) and "
                                    @"TransitionTime=0 (immediately) Error: %@",
                                  err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_4()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThSendsStepHueCommandToDutWithStepMode0x01UpStepSize60AndTransitionTime20020s_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterStepHueParams alloc] init];
        params.stepMode = [NSNumber numberWithUnsignedChar:1U];
        params.stepSize = [NSNumber numberWithUnsignedChar:60U];
        params.transitionTime = [NSNumber numberWithUnsignedChar:200U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster stepHueWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"TH sends StepHue command to DUT with StepMode=0x01 (up), StepSize=60 and TransitionTime=200 "
                                  @"(20s) Error: %@",
                                err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_6()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentHueAttributeFromDut_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentHue", [value unsignedCharValue], 195U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentHue", [value unsignedCharValue], 254U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_8()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentHueAttributeFromDut_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentHue", [value unsignedCharValue], 4U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentHue", [value unsignedCharValue], 6U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait5s_10()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 5000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentHueAttributeFromDut_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentHue", [value unsignedCharValue], 4U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentHue", [value unsignedCharValue], 6U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToHueCommandToDutWithHue50Direction0x00ShortestDistanceAndTransitionTime0Immediately_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToHueParams alloc] init];
        params.hue = [NSNumber numberWithUnsignedChar:50U];
        params.direction = [NSNumber numberWithUnsignedChar:0U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToHueWithParams:params
                          completion:^(NSError * _Nullable err) {
                              NSLog(@"TH sends MoveToHue command to DUT with Hue=50, Direction=0x00 (shortest distance) and "
                                    @"TransitionTime=0 (immediately) Error: %@",
                                  err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_13()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThSendsStepHueCommandToDutWithStepMode0x03DownStepSize60AndTransitionTime20020s_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterStepHueParams alloc] init];
        params.stepMode = [NSNumber numberWithUnsignedChar:3U];
        params.stepSize = [NSNumber numberWithUnsignedChar:60U];
        params.transitionTime = [NSNumber numberWithUnsignedChar:200U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster stepHueWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"TH sends StepHue command to DUT with StepMode=0x03 (down), StepSize=60 and TransitionTime=200 "
                                  @"(20s) Error: %@",
                                err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_15()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentHueAttributeFromDut_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentHue", [value unsignedCharValue], 17U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentHue", [value unsignedCharValue], 23U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_17()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentHueAttributeFromDut_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentHue", [value unsignedCharValue], 208U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentHue", [value unsignedCharValue], 255U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait5s_19()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 5000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentHueAttributeFromDut_20()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentHue", [value unsignedCharValue], 208U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentHue", [value unsignedCharValue], 255U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorModeAttributeFromDut_21()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorMode attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ColorMode", actualValue, 0U));
            }

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("colorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("colorMode", [value unsignedCharValue], 2U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsEnhancedColorModeAttributeFromDut_22()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedColorMode attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("EnhancedColorMode", actualValue, 0U));
            }

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("enhancedColorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("enhancedColorMode", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTurnOffLightThatWeTurnedOn_23()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Turn off light that we turned on Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_24()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is false after off command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_4_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_CC_4_1()
        : TestCommandBridge("Test_TC_CC_4_1")
        , mTestIndex(0)
    {
        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);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_CC_4_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_CC_4_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_CC_4_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH writes 0 to the Options attribute\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThWrites0ToTheOptionsAttribute_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH sends On command to DUT\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool,
                " ***** Test Step 3 : TH sends MoveToSaturation command to DUT with Saturation=60 and TransitionTime=0 "
                "(immediately)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToSaturationCommandToDutWithSaturation60AndTransitionTime0Immediately_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Wait 100ms\n");
            err = TestWait100ms_4();
            break;
        case 5:
            ChipLogProgress(chipTool,
                " ***** Test Step 5 : TH sends MoveToSaturation command to DUT with Saturation=120 and TransitionTime=300 (30s)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToSaturationCommandToDutWithSaturation120AndTransitionTime30030s_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Wait 10s\n");
            err = TestWait10s_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Wait 10s\n");
            err = TestWait10s_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Wait 10s\n");
            err = TestWait10s_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Wait 5s\n");
            err = TestWait5s_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : TH reads ColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0008")) {
                NextTest();
                return;
            }
            err = TestThReadsColorModeAttributeFromDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : TH reads EnhancedColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A4001")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedColorModeAttributeFromDut_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Turn off light that we turned on\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestTurnOffLightThatWeTurnedOn_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Check on/off attribute value is false after off command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsFalseAfterOffCommand_17();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 18;

    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_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThWrites0ToTheOptionsAttribute_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"TH writes 0 to the Options attribute Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOnCommandToDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends On command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToSaturationCommandToDutWithSaturation60AndTransitionTime0Immediately_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToSaturationParams alloc] init];
        params.saturation = [NSNumber numberWithUnsignedChar:60U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToSaturationWithParams:params
                                 completion:^(NSError * _Nullable err) {
                                     NSLog(@"TH sends MoveToSaturation command to DUT with Saturation=60 and TransitionTime=0 "
                                           @"(immediately) Error: %@",
                                         err);

                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_4()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThSendsMoveToSaturationCommandToDutWithSaturation120AndTransitionTime30030s_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToSaturationParams alloc] init];
        params.saturation = [NSNumber numberWithUnsignedChar:120U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:300U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToSaturationWithParams:params
                                 completion:^(NSError * _Nullable err) {
                                     NSLog(@"TH sends MoveToSaturation command to DUT with Saturation=120 and TransitionTime=300 "
                                           @"(30s) Error: %@",
                                         err);

                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_6()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 68U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 92U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_8()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 80U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 115U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_10()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 102U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 138U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait5s_12()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 5000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 102U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 138U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorModeAttributeFromDut_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorMode attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ColorMode", actualValue, 0U));
            }

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("colorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("colorMode", [value unsignedCharValue], 2U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsEnhancedColorModeAttributeFromDut_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedColorMode attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("EnhancedColorMode", actualValue, 0U));
            }

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("enhancedColorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("enhancedColorMode", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTurnOffLightThatWeTurnedOn_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Turn off light that we turned on Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is false after off command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_4_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_CC_4_2()
        : TestCommandBridge("Test_TC_CC_4_2")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_CC_4_2() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_CC_4_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_CC_4_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH writes 0 to the Options attribute\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThWrites0ToTheOptionsAttribute_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH sends On command to DUT\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool,
                " ***** Test Step 3 : TH sends MoveToSaturation command to DUT with Saturation=150 and TransitionTime=0 "
                "(immediately)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToSaturationCommandToDutWithSaturation150AndTransitionTime0Immediately_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Wait 100ms\n");
            err = TestWait100ms_4();
            break;
        case 5:
            ChipLogProgress(chipTool,
                " ***** Test Step 5 : TH sends MoveSaturation command to DUT with MoveMode=0x01 (up) and Rate=5 (units/s)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C04.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveSaturationCommandToDutWithMoveMode0x01UpAndRate5UnitsS_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Wait 10s\n");
            err = TestWait10s_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Wait 10s\n");
            err = TestWait10s_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Wait 5s\n");
            err = TestWait5s_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool,
                " ***** Test Step 12 : TH sends MoveToSaturation command to DUT with Saturation=120 and TransitionTime=0 "
                "(immediately)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToSaturationCommandToDutWithSaturation120AndTransitionTime0Immediately_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Wait 100ms\n");
            err = TestWait100ms_13();
            break;
        case 14:
            ChipLogProgress(chipTool,
                " ***** Test Step 14 : TH sends MoveSaturation command to DUT with MoveMode=0x03 (down) and Rate=5 (units/s)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C04.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveSaturationCommandToDutWithMoveMode0x03DownAndRate5UnitsS_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Wait 10s\n");
            err = TestWait10s_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Wait 10s\n");
            err = TestWait10s_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Wait 10s\n");
            err = TestWait10s_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_20();
            break;
        case 21:
            ChipLogProgress(chipTool,
                " ***** Test Step 21 : TH sends MoveToSaturation command to DUT with Saturation=150 and TransitionTime=0 "
                "(immediately)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToSaturationCommandToDutWithSaturation150AndTransitionTime0Immediately_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : Wait 100ms\n");
            err = TestWait100ms_22();
            break;
        case 23:
            ChipLogProgress(chipTool,
                " ***** Test Step 23 : TH sends MoveSaturation command to DUT with MoveMode=0x01 (up) and Rate=5 (units/s)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C04.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveSaturationCommandToDutWithMoveMode0x01UpAndRate5UnitsS_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : Wait 10s\n");
            err = TestWait10s_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_25();
            break;
        case 26:
            ChipLogProgress(chipTool,
                " ***** Test Step 26 : TH sends MoveSaturation command to DUT with MoveMode=0x00 (stop) and Rate=5 (units/s)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C04.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveSaturationCommandToDutWithMoveMode0x00StopAndRate5UnitsS_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_27();
            break;
        case 28:
            ChipLogProgress(chipTool, " ***** Test Step 28 : Wait 2s\n");
            err = TestWait2s_28();
            break;
        case 29:
            ChipLogProgress(chipTool, " ***** Test Step 29 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_29();
            break;
        case 30:
            ChipLogProgress(chipTool, " ***** Test Step 30 : TH reads ColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0008")) {
                NextTest();
                return;
            }
            err = TestThReadsColorModeAttributeFromDut_30();
            break;
        case 31:
            ChipLogProgress(chipTool, " ***** Test Step 31 : TH reads EnhancedColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A4001")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedColorModeAttributeFromDut_31();
            break;
        case 32:
            ChipLogProgress(chipTool, " ***** Test Step 32 : Turn off light that we turned on\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestTurnOffLightThatWeTurnedOn_32();
            break;
        case 33:
            ChipLogProgress(chipTool, " ***** Test Step 33 : Check on/off attribute value is false after off command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsFalseAfterOffCommand_33();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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));
            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));
            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));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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));
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 34;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThWrites0ToTheOptionsAttribute_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"TH writes 0 to the Options attribute Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOnCommandToDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends On command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToSaturationCommandToDutWithSaturation150AndTransitionTime0Immediately_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToSaturationParams alloc] init];
        params.saturation = [NSNumber numberWithUnsignedChar:150U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToSaturationWithParams:params
                                 completion:^(NSError * _Nullable err) {
                                     NSLog(@"TH sends MoveToSaturation command to DUT with Saturation=150 and TransitionTime=0 "
                                           @"(immediately) Error: %@",
                                         err);

                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_4()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThSendsMoveSaturationCommandToDutWithMoveMode0x01UpAndRate5UnitsS_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveSaturationParams alloc] init];
        params.moveMode = [NSNumber numberWithUnsignedChar:1U];
        params.rate = [NSNumber numberWithUnsignedChar:5U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster
            moveSaturationWithParams:params
                          completion:^(NSError * _Nullable err) {
                              NSLog(
                                  @"TH sends MoveSaturation command to DUT with MoveMode=0x01 (up) and Rate=5 (units/s) Error: %@",
                                  err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_6()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 170U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 230U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_8()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 216U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 254U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait5s_10()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 5000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 216U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 254U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToSaturationCommandToDutWithSaturation120AndTransitionTime0Immediately_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToSaturationParams alloc] init];
        params.saturation = [NSNumber numberWithUnsignedChar:120U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToSaturationWithParams:params
                                 completion:^(NSError * _Nullable err) {
                                     NSLog(@"TH sends MoveToSaturation command to DUT with Saturation=120 and TransitionTime=0 "
                                           @"(immediately) Error: %@",
                                         err);

                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_13()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThSendsMoveSaturationCommandToDutWithMoveMode0x03DownAndRate5UnitsS_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveSaturationParams alloc] init];
        params.moveMode = [NSNumber numberWithUnsignedChar:3U];
        params.rate = [NSNumber numberWithUnsignedChar:5U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveSaturationWithParams:params
                               completion:^(NSError * _Nullable err) {
                                   NSLog(@"TH sends MoveSaturation command to DUT with MoveMode=0x03 (down) and Rate=5 (units/s) "
                                         @"Error: %@",
                                       err);

                                   VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                   NextTest();
                               }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_15()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 59U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 81U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_17()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 17U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 23U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_19()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_20()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 10U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToSaturationCommandToDutWithSaturation150AndTransitionTime0Immediately_21()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToSaturationParams alloc] init];
        params.saturation = [NSNumber numberWithUnsignedChar:150U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToSaturationWithParams:params
                                 completion:^(NSError * _Nullable err) {
                                     NSLog(@"TH sends MoveToSaturation command to DUT with Saturation=150 and TransitionTime=0 "
                                           @"(immediately) Error: %@",
                                         err);

                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_22()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThSendsMoveSaturationCommandToDutWithMoveMode0x01UpAndRate5UnitsS_23()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveSaturationParams alloc] init];
        params.moveMode = [NSNumber numberWithUnsignedChar:1U];
        params.rate = [NSNumber numberWithUnsignedChar:5U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster
            moveSaturationWithParams:params
                          completion:^(NSError * _Nullable err) {
                              NSLog(
                                  @"TH sends MoveSaturation command to DUT with MoveMode=0x01 (up) and Rate=5 (units/s) Error: %@",
                                  err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_24()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_25()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 170U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 230U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveSaturationCommandToDutWithMoveMode0x00StopAndRate5UnitsS_26()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveSaturationParams alloc] init];
        params.moveMode = [NSNumber numberWithUnsignedChar:0U];
        params.rate = [NSNumber numberWithUnsignedChar:5U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveSaturationWithParams:params
                               completion:^(NSError * _Nullable err) {
                                   NSLog(@"TH sends MoveSaturation command to DUT with MoveMode=0x00 (stop) and Rate=5 (units/s) "
                                         @"Error: %@",
                                       err);

                                   VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                   NextTest();
                               }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_27()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 170U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 230U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait2s_28()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 2000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_29()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 170U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 230U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorModeAttributeFromDut_30()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorMode attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ColorMode", actualValue, 0U));
            }

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("colorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("colorMode", [value unsignedCharValue], 2U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsEnhancedColorModeAttributeFromDut_31()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedColorMode attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("EnhancedColorMode", actualValue, 0U));
            }

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("enhancedColorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("enhancedColorMode", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTurnOffLightThatWeTurnedOn_32()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Turn off light that we turned on Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_33()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is false after off command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_4_3 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_CC_4_3()
        : TestCommandBridge("Test_TC_CC_4_3")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_CC_4_3() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_CC_4_3\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_CC_4_3\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH writes 0 to the Options attribute\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThWrites0ToTheOptionsAttribute_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH sends On command to DUT\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool,
                " ***** Test Step 3 : TH sends MoveToSaturation command to DUT with Saturation=200 and TransitionTime=0 "
                "(immediately)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToSaturationCommandToDutWithSaturation200AndTransitionTime0Immediately_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Wait 100ms\n");
            err = TestWait100ms_4();
            break;
        case 5:
            ChipLogProgress(chipTool,
                " ***** Test Step 5 : TH sends StepSaturation command to DUT with StepMode=0x01 (up), StepSize=40 and "
                "TransitionTime=200 (20s)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C05.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsStepSaturationCommandToDutWithStepMode0x01UpStepSize40AndTransitionTime20020s_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Wait 10s\n");
            err = TestWait10s_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Wait 10s\n");
            err = TestWait10s_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Wait 5s\n");
            err = TestWait5s_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool,
                " ***** Test Step 12 : TH sends StepSaturation command to DUT with StepMode=0x01 (up), StepSize=20 and "
                "TransitionTime=100 (10s)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C05.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsStepSaturationCommandToDutWithStepMode0x01UpStepSize20AndTransitionTime10010s_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Wait 10s\n");
            err = TestWait10s_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool,
                " ***** Test Step 15 : TH sends MoveToSaturation command to DUT with Saturation=50 and TransitionTime=0 "
                "(immediately)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToSaturationCommandToDutWithSaturation50AndTransitionTime0Immediately_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Wait 100ms\n");
            err = TestWait100ms_16();
            break;
        case 17:
            ChipLogProgress(chipTool,
                " ***** Test Step 17 : TH sends StepSaturation command to DUT with StepMode=0x03 (down), StepSize=40 and "
                "TransitionTime=200 (20s)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C05.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsStepSaturationCommandToDutWithStepMode0x03DownStepSize40AndTransitionTime20020s_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Wait 10s\n");
            err = TestWait10s_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Wait 10s\n");
            err = TestWait10s_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : Wait 5s\n");
            err = TestWait5s_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_23();
            break;
        case 24:
            ChipLogProgress(chipTool,
                " ***** Test Step 24 : TH sends StepSaturation command to DUT with StepMode=0x03 (down), StepSize=20 and "
                "TransitionTime=100 (10 s)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C05.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsStepSaturationCommandToDutWithStepMode0x03DownStepSize20AndTransitionTime10010S_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : Wait 10s\n");
            err = TestWait10s_25();
            break;
        case 26:
            ChipLogProgress(chipTool, " ***** Test Step 26 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : TH reads ColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0008")) {
                NextTest();
                return;
            }
            err = TestThReadsColorModeAttributeFromDut_27();
            break;
        case 28:
            ChipLogProgress(chipTool, " ***** Test Step 28 : TH reads EnhancedColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A4001")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedColorModeAttributeFromDut_28();
            break;
        case 29:
            ChipLogProgress(chipTool, " ***** Test Step 29 : Turn off light that we turned on\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestTurnOffLightThatWeTurnedOn_29();
            break;
        case 30:
            ChipLogProgress(chipTool, " ***** Test Step 30 : Check on/off attribute value is false after off command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsFalseAfterOffCommand_30();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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));
            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));
            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));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 31;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThWrites0ToTheOptionsAttribute_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"TH writes 0 to the Options attribute Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOnCommandToDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends On command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToSaturationCommandToDutWithSaturation200AndTransitionTime0Immediately_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToSaturationParams alloc] init];
        params.saturation = [NSNumber numberWithUnsignedChar:200U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToSaturationWithParams:params
                                 completion:^(NSError * _Nullable err) {
                                     NSLog(@"TH sends MoveToSaturation command to DUT with Saturation=200 and TransitionTime=0 "
                                           @"(immediately) Error: %@",
                                         err);

                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_4()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThSendsStepSaturationCommandToDutWithStepMode0x01UpStepSize40AndTransitionTime20020s_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterStepSaturationParams alloc] init];
        params.stepMode = [NSNumber numberWithUnsignedChar:1U];
        params.stepSize = [NSNumber numberWithUnsignedChar:40U];
        params.transitionTime = [NSNumber numberWithUnsignedChar:200U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster stepSaturationWithParams:params
                               completion:^(NSError * _Nullable err) {
                                   NSLog(@"TH sends StepSaturation command to DUT with StepMode=0x01 (up), StepSize=40 and "
                                         @"TransitionTime=200 (20s) Error: %@",
                                       err);

                                   VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                   NextTest();
                               }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_6()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 187U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 253U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_8()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 204U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 254U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait5s_10()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 5000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 204U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 254U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsStepSaturationCommandToDutWithStepMode0x01UpStepSize20AndTransitionTime10010s_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterStepSaturationParams alloc] init];
        params.stepMode = [NSNumber numberWithUnsignedChar:1U];
        params.stepSize = [NSNumber numberWithUnsignedChar:20U];
        params.transitionTime = [NSNumber numberWithUnsignedChar:100U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster stepSaturationWithParams:params
                               completion:^(NSError * _Nullable err) {
                                   NSLog(@"TH sends StepSaturation command to DUT with StepMode=0x01 (up), StepSize=20 and "
                                         @"TransitionTime=100 (10s) Error: %@",
                                       err);

                                   VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                   NextTest();
                               }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_13()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 216U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 254U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToSaturationCommandToDutWithSaturation50AndTransitionTime0Immediately_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToSaturationParams alloc] init];
        params.saturation = [NSNumber numberWithUnsignedChar:50U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToSaturationWithParams:params
                                 completion:^(NSError * _Nullable err) {
                                     NSLog(@"TH sends MoveToSaturation command to DUT with Saturation=50 and TransitionTime=0 "
                                           @"(immediately) Error: %@",
                                         err);

                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_16()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThSendsStepSaturationCommandToDutWithStepMode0x03DownStepSize40AndTransitionTime20020s_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterStepSaturationParams alloc] init];
        params.stepMode = [NSNumber numberWithUnsignedChar:3U];
        params.stepSize = [NSNumber numberWithUnsignedChar:40U];
        params.transitionTime = [NSNumber numberWithUnsignedChar:200U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster stepSaturationWithParams:params
                               completion:^(NSError * _Nullable err) {
                                   NSLog(@"TH sends StepSaturation command to DUT with StepMode=0x03 (down), StepSize=40 and "
                                         @"TransitionTime=200 (20s) Error: %@",
                                       err);

                                   VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                   NextTest();
                               }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_18()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_19()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 25U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 35U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_20()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_21()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 8U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 12U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait5s_22()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 5000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_23()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 8U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 12U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsStepSaturationCommandToDutWithStepMode0x03DownStepSize20AndTransitionTime10010S_24()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterStepSaturationParams alloc] init];
        params.stepMode = [NSNumber numberWithUnsignedChar:3U];
        params.stepSize = [NSNumber numberWithUnsignedChar:20U];
        params.transitionTime = [NSNumber numberWithUnsignedChar:100U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster stepSaturationWithParams:params
                               completion:^(NSError * _Nullable err) {
                                   NSLog(@"TH sends StepSaturation command to DUT with StepMode=0x03 (down), StepSize=20 and "
                                         @"TransitionTime=100 (10 s) Error: %@",
                                       err);

                                   VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                   NextTest();
                               }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_25()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_26()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentSaturation", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorModeAttributeFromDut_27()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorMode attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ColorMode", actualValue, 0U));
            }

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("colorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("colorMode", [value unsignedCharValue], 2U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsEnhancedColorModeAttributeFromDut_28()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedColorMode attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("EnhancedColorMode", actualValue, 0U));
            }

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("enhancedColorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("enhancedColorMode", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTurnOffLightThatWeTurnedOn_29()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Turn off light that we turned on Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_30()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is false after off command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_4_4 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_CC_4_4()
        : TestCommandBridge("Test_TC_CC_4_4")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_CC_4_4() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_CC_4_4\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_CC_4_4\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH writes 0 to the Options attribute\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThWrites0ToTheOptionsAttribute_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH sends On command to DUT\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool,
                " ***** Test Step 3 : TH sends MoveToHueAndSaturation command to DUT with Hue=200, Saturation=50 and "
                "TransitionTime=0 (immediately)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C06.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToHueAndSaturationCommandToDutWithHue200Saturation50AndTransitionTime0Immediately_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Wait 100ms\n");
            err = TestWait100ms_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH reads CurrentHue attribute from DUT.\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0000 && CC.S.C06.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentHueAttributeFromDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool,
                " ***** Test Step 7 : TH sends MoveToHueAndSaturation command to DUT with Hue=160, Saturation=80 and "
                "TransitionTime=200 (20s)\n");
            if (ShouldSkip("CC.S.F00 && CC.S.C06.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToHueAndSaturationCommandToDutWithHue160Saturation80AndTransitionTime20020s_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Wait 10s\n");
            err = TestWait10s_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH reads CurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentHueAttributeFromDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Wait 10s\n");
            err = TestWait10s_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : TH reads CurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentHueAttributeFromDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Wait 5s\n");
            err = TestWait5s_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : TH reads CurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentHueAttributeFromDut_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : TH reads ColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0008")) {
                NextTest();
                return;
            }
            err = TestThReadsColorModeAttributeFromDut_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : TH reads EnhancedColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A4001")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedColorModeAttributeFromDut_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Turn off light that we turned on\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestTurnOffLightThatWeTurnedOn_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Check on/off attribute value is false after off command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsFalseAfterOffCommand_20();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 21;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThWrites0ToTheOptionsAttribute_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"TH writes 0 to the Options attribute Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOnCommandToDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends On command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToHueAndSaturationCommandToDutWithHue200Saturation50AndTransitionTime0Immediately_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToHueAndSaturationParams alloc] init];
        params.hue = [NSNumber numberWithUnsignedChar:200U];
        params.saturation = [NSNumber numberWithUnsignedChar:50U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToHueAndSaturationWithParams:params
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(@"TH sends MoveToHueAndSaturation command to DUT with Hue=200, Saturation=50 and "
                                                 @"TransitionTime=0 (immediately) Error: %@",
                                               err);

                                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_4()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentHueAttributeFromDut_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentHue attribute from DUT. Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentHue", [value unsignedCharValue], 170U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentHue", [value unsignedCharValue], 230U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 42U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 58U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToHueAndSaturationCommandToDutWithHue160Saturation80AndTransitionTime20020s_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToHueAndSaturationParams alloc] init];
        params.hue = [NSNumber numberWithUnsignedChar:160U];
        params.saturation = [NSNumber numberWithUnsignedChar:80U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:200U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToHueAndSaturationWithParams:params
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(@"TH sends MoveToHueAndSaturation command to DUT with Hue=160, Saturation=80 and "
                                                 @"TransitionTime=200 (20s) Error: %@",
                                               err);

                                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_8()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentHueAttributeFromDut_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentHue", [value unsignedCharValue], 160U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentHue", [value unsignedCharValue], 200U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 50U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 80U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_11()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentHueAttributeFromDut_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentHue", [value unsignedCharValue], 135U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentHue", [value unsignedCharValue], 185U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("currentSaturation", "int8u", "int8u"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 68U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 92U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait5s_14()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 5000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentHueAttributeFromDut_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentHue", [value unsignedCharValue], 135U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentHue", [value unsignedCharValue], 185U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 68U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 92U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorModeAttributeFromDut_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorMode attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ColorMode", actualValue, 0U));
            }

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("colorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("colorMode", [value unsignedCharValue], 2U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsEnhancedColorModeAttributeFromDut_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedColorMode attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("EnhancedColorMode", actualValue, 0U));
            }

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("enhancedColorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("enhancedColorMode", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTurnOffLightThatWeTurnedOn_19()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Turn off light that we turned on Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_20()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is false after off command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_5_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_CC_5_1()
        : TestCommandBridge("Test_TC_CC_5_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_CC_5_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_CC_5_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_CC_5_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH writes 0 to the Options attribute\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThWrites0ToTheOptionsAttribute_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH sends On command to DUT\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool,
                " ***** Test Step 3 : TH sends MoveToColor command to DUT, with ColorX = 32768/0x8000 ColorY = 19660/0x4CCC "
                "TransitionTime = 0 (immediate)\n");
            if (ShouldSkip("CC.S.F03 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToColorCommandToDutWithColorX327680x8000ColorY196600x4CCCTransitionTime0Immediate_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Wait 100ms\n");
            err = TestWait100ms_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH reads CurrentX attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0003")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentXAttributeFromDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : TH reads CurrentY attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0004")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentYAttributeFromDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool,
                " ***** Test Step 7 : TH sends MoveToColor command to DUT, with ColorX = 13107/0x3333 ColorY = 13107/0x3333 "
                "TransitionTime = 200 (20s)\n");
            if (ShouldSkip("CC.S.F03 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToColorCommandToDutWithColorX131070x3333ColorY131070x3333TransitionTime20020s_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Wait 10s\n");
            err = TestWait10s_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH reads CurrentX attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentXAttributeFromDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : TH reads CurrentY attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentYAttributeFromDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Wait 10s\n");
            err = TestWait10s_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : TH reads CurrentX attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentXAttributeFromDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : TH reads CurrentY attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentYAttributeFromDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Wait 5s\n");
            err = TestWait5s_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : TH reads CurrentX attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentXAttributeFromDut_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : TH reads CurrentY attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentYAttributeFromDut_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : TH writes 0 to the Options attribute\n");
            if (ShouldSkip("CC.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThWrites0ToTheOptionsAttribute_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : TH read Options attribute\n");
            if (ShouldSkip("CC.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThReadOptionsAttribute_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : TH sends On command to DUT\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_19();
            break;
        case 20:
            ChipLogProgress(chipTool,
                " ***** Test Step 20 : TH sends a MoveToColor command to the DUT with ColorX = 32768/0x8000 (x=0.5) (purple) "
                "ColorY = 19660/0x4CCC (y=0.3) TransitionTime = 0 (immediate)\n");
            if (ShouldSkip("CC.S.F03 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveToColorCommandToTheDutWithColorX327680x8000X05PurpleColorY196600x4CCCY03TransitionTime0Immediate_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Wait 100ms\n");
            err = TestWait100ms_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : TH reads CurrentX attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentXAttributeFromDut_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : TH reads CurrentY attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentYAttributeFromDut_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : TH sends Off command to DUT\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOffCommandToDut_24();
            break;
        case 25:
            ChipLogProgress(chipTool,
                " ***** Test Step 25 : TH sends MoveToColor command to DUT, with ColorX = 13107/0x3333 ColorY = 13107/0x3333 "
                "TransitionTime = 0 (immediate)\n");
            if (ShouldSkip("CC.S.F03 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToColorCommandToDutWithColorX131070x3333ColorY131070x3333TransitionTime0Immediate_25();
            break;
        case 26:
            ChipLogProgress(chipTool, " ***** Test Step 26 : Wait 100ms\n");
            err = TestWait100ms_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : TH reads CurrentX attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentXAttributeFromDut_27();
            break;
        case 28:
            ChipLogProgress(chipTool, " ***** Test Step 28 : TH reads CurrentY attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentYAttributeFromDut_28();
            break;
        case 29:
            ChipLogProgress(chipTool,
                " ***** Test Step 29 : TH sends MoveToColor command to DUT, with ColorX = 13107/0x3333 ColorY = 32768/0x8000 "
                "TransitionTime = 0 (immediate)\n");
            if (ShouldSkip("CC.S.F03 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToColorCommandToDutWithColorX131070x3333ColorY327680x8000TransitionTime0Immediate_29();
            break;
        case 30:
            ChipLogProgress(chipTool, " ***** Test Step 30 : Wait 100ms\n");
            err = TestWait100ms_30();
            break;
        case 31:
            ChipLogProgress(chipTool, " ***** Test Step 31 : TH reads CurrentX attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentXAttributeFromDut_31();
            break;
        case 32:
            ChipLogProgress(chipTool, " ***** Test Step 32 : TH reads CurrentY attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentYAttributeFromDut_32();
            break;
        case 33:
            ChipLogProgress(chipTool,
                " ***** Test Step 33 : TH sends MoveToColor command to DUT, with ColorX = 26214/0x6666 ColorY = 32768/0x8000 "
                "TransitionTime = 0 (immediate)\n");
            if (ShouldSkip("CC.S.F03 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToColorCommandToDutWithColorX262140x6666ColorY327680x8000TransitionTime0Immediate_33();
            break;
        case 34:
            ChipLogProgress(chipTool, " ***** Test Step 34 : Wait 100ms\n");
            err = TestWait100ms_34();
            break;
        case 35:
            ChipLogProgress(chipTool, " ***** Test Step 35 : TH reads CurrentX attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentXAttributeFromDut_35();
            break;
        case 36:
            ChipLogProgress(chipTool, " ***** Test Step 36 : TH reads CurrentY attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentYAttributeFromDut_36();
            break;
        case 37:
            ChipLogProgress(chipTool, " ***** Test Step 37 : TH writes 1 to the Options attribute\n");
            if (ShouldSkip("CC.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThWrites1ToTheOptionsAttribute_37();
            break;
        case 38:
            ChipLogProgress(chipTool, " ***** Test Step 38 : TH read Options attribute\n");
            if (ShouldSkip("CC.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThReadOptionsAttribute_38();
            break;
        case 39:
            ChipLogProgress(chipTool, " ***** Test Step 39 : TH sends On command to DUT\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_39();
            break;
        case 40:
            ChipLogProgress(chipTool,
                " ***** Test Step 40 : TH sends MoveToColor command to DUT, with ColorX = 32768/0x8000 ColorY = 19660/0x4CCC "
                "TransitionTime = 0 (immediate)\n");
            if (ShouldSkip("CC.S.F03 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToColorCommandToDutWithColorX327680x8000ColorY196600x4CCCTransitionTime0Immediate_40();
            break;
        case 41:
            ChipLogProgress(chipTool, " ***** Test Step 41 : Wait 100ms\n");
            err = TestWait100ms_41();
            break;
        case 42:
            ChipLogProgress(chipTool, " ***** Test Step 42 : TH reads CurrentX attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentXAttributeFromDut_42();
            break;
        case 43:
            ChipLogProgress(chipTool, " ***** Test Step 43 : TH reads CurrentY attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentYAttributeFromDut_43();
            break;
        case 44:
            ChipLogProgress(chipTool, " ***** Test Step 44 : TH sends Off command to DUT\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOffCommandToDut_44();
            break;
        case 45:
            ChipLogProgress(chipTool,
                " ***** Test Step 45 : TH sends MoveToColor command to DUT, with ColorX = 13107/0x3333 ColorY = 13107/0x3333 "
                "TransitionTime = 0 (immediate)\n");
            if (ShouldSkip("CC.S.F03 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToColorCommandToDutWithColorX131070x3333ColorY131070x3333TransitionTime0Immediate_45();
            break;
        case 46:
            ChipLogProgress(chipTool, " ***** Test Step 46 : Wait 100ms\n");
            err = TestWait100ms_46();
            break;
        case 47:
            ChipLogProgress(chipTool, " ***** Test Step 47 : TH reads CurrentX attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentXAttributeFromDut_47();
            break;
        case 48:
            ChipLogProgress(chipTool, " ***** Test Step 48 : TH reads CurrentY attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentYAttributeFromDut_48();
            break;
        case 49:
            ChipLogProgress(chipTool,
                " ***** Test Step 49 : TH sends MoveToColor command to DUT, with ColorX = 13107/0x3333 ColorY = 32768/0x8000 "
                "TransitionTime = 0 (immediate)\n");
            if (ShouldSkip("CC.S.F03 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToColorCommandToDutWithColorX131070x3333ColorY327680x8000TransitionTime0Immediate_49();
            break;
        case 50:
            ChipLogProgress(chipTool, " ***** Test Step 50 : Wait 100ms\n");
            err = TestWait100ms_50();
            break;
        case 51:
            ChipLogProgress(chipTool, " ***** Test Step 51 : TH reads CurrentX attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentXAttributeFromDut_51();
            break;
        case 52:
            ChipLogProgress(chipTool, " ***** Test Step 52 : TH reads CurrentY attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentYAttributeFromDut_52();
            break;
        case 53:
            ChipLogProgress(chipTool,
                " ***** Test Step 53 : TH sends MoveToColor command to DUT, with ColorX = 26214/0x6666 ColorY = 32768/0x8000 "
                "TransitionTime = 0 (immediate)\n");
            if (ShouldSkip("CC.S.F03 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToColorCommandToDutWithColorX262140x6666ColorY327680x8000TransitionTime0Immediate_53();
            break;
        case 54:
            ChipLogProgress(chipTool, " ***** Test Step 54 : Wait 100ms\n");
            err = TestWait100ms_54();
            break;
        case 55:
            ChipLogProgress(chipTool, " ***** Test Step 55 : TH reads CurrentX attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentXAttributeFromDut_55();
            break;
        case 56:
            ChipLogProgress(chipTool, " ***** Test Step 56 : TH reads CurrentY attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentYAttributeFromDut_56();
            break;
        case 57:
            ChipLogProgress(chipTool, " ***** Test Step 57 : TH reads ColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0008")) {
                NextTest();
                return;
            }
            err = TestThReadsColorModeAttributeFromDut_57();
            break;
        case 58:
            ChipLogProgress(chipTool, " ***** Test Step 58 : TH reads EnhancedColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A4001")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedColorModeAttributeFromDut_58();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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));
            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));
            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));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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));
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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));
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 46:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 50:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 51:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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));
            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));
            break;
        case 58:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 59;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThWrites0ToTheOptionsAttribute_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"TH writes 0 to the Options attribute Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOnCommandToDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends On command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToColorCommandToDutWithColorX327680x8000ColorY196600x4CCCTransitionTime0Immediate_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToColorParams alloc] init];
        params.colorX = [NSNumber numberWithUnsignedShort:32768U];
        params.colorY = [NSNumber numberWithUnsignedShort:19660U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToColorWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"TH sends MoveToColor command to DUT, with ColorX = 32768/0x8000 ColorY = 19660/0x4CCC "
                                      @"TransitionTime = 0 (immediate) Error: %@",
                                    err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_4()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentXAttributeFromDut_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentX attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentX", [value unsignedShortValue], 27853U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentX", [value unsignedShortValue], 37683U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentY attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentY", [value unsignedShortValue], 16711U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentY", [value unsignedShortValue], 22609U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToColorCommandToDutWithColorX131070x3333ColorY131070x3333TransitionTime20020s_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToColorParams alloc] init];
        params.colorX = [NSNumber numberWithUnsignedShort:13107U];
        params.colorY = [NSNumber numberWithUnsignedShort:13107U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:200U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToColorWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"TH sends MoveToColor command to DUT, with ColorX = 13107/0x3333 ColorY = 13107/0x3333 "
                                      @"TransitionTime = 200 (20s) Error: %@",
                                    err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_8()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentXAttributeFromDut_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentX attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentX", [value unsignedShortValue], 13107U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentX", [value unsignedShortValue], 32768U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentY attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentY", [value unsignedShortValue], 13107U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentY", [value unsignedShortValue], 19660U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_11()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentXAttributeFromDut_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentX attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentX", [value unsignedShortValue], 11141U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentX", [value unsignedShortValue], 15073U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentY attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentY", [value unsignedShortValue], 11141U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentY", [value unsignedShortValue], 15073U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait5s_14()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 5000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentXAttributeFromDut_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentX attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentX", [value unsignedShortValue], 11141U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentX", [value unsignedShortValue], 15073U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentY attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentY", [value unsignedShortValue], 11141U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentY", [value unsignedShortValue], 15073U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWrites0ToTheOptionsAttribute_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"TH writes 0 to the Options attribute Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadOptionsAttribute_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOptionsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH read Options attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("Options", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOnCommandToDut_19()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends On command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsAMoveToColorCommandToTheDutWithColorX327680x8000X05PurpleColorY196600x4CCCY03TransitionTime0Immediate_20()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToColorParams alloc] init];
        params.colorX = [NSNumber numberWithUnsignedShort:32768U];
        params.colorY = [NSNumber numberWithUnsignedShort:19660U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToColorWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"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) Error: %@",
                                    err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_21()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentXAttributeFromDut_22()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentX attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentX", [value unsignedShortValue], 27853U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentX", [value unsignedShortValue], 37683U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_23()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentY attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentY", [value unsignedShortValue], 16711U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentY", [value unsignedShortValue], 22609U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOffCommandToDut_24()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends Off command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToColorCommandToDutWithColorX131070x3333ColorY131070x3333TransitionTime0Immediate_25()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToColorParams alloc] init];
        params.colorX = [NSNumber numberWithUnsignedShort:13107U];
        params.colorY = [NSNumber numberWithUnsignedShort:13107U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToColorWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"TH sends MoveToColor command to DUT, with ColorX = 13107/0x3333 ColorY = 13107/0x3333 "
                                      @"TransitionTime = 0 (immediate) Error: %@",
                                    err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_26()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentXAttributeFromDut_27()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentX attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentX", actualValue, 32768U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_28()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentY attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentY", actualValue, 19660U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToColorCommandToDutWithColorX131070x3333ColorY327680x8000TransitionTime0Immediate_29()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToColorParams alloc] init];
        params.colorX = [NSNumber numberWithUnsignedShort:13107U];
        params.colorY = [NSNumber numberWithUnsignedShort:32768U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:1U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToColorWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"TH sends MoveToColor command to DUT, with ColorX = 13107/0x3333 ColorY = 32768/0x8000 "
                                      @"TransitionTime = 0 (immediate) Error: %@",
                                    err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_30()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentXAttributeFromDut_31()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentX attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentX", actualValue, 32768U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_32()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentY attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentY", actualValue, 19660U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToColorCommandToDutWithColorX262140x6666ColorY327680x8000TransitionTime0Immediate_33()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToColorParams alloc] init];
        params.colorX = [NSNumber numberWithUnsignedShort:26214U];
        params.colorY = [NSNumber numberWithUnsignedShort:32768U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:1U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:1U];
        [cluster moveToColorWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"TH sends MoveToColor command to DUT, with ColorX = 26214/0x6666 ColorY = 32768/0x8000 "
                                      @"TransitionTime = 0 (immediate) Error: %@",
                                    err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_34()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentXAttributeFromDut_35()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentX attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentX", [value unsignedShortValue], 22282U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentX", [value unsignedShortValue], 30146U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_36()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentY attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentY", [value unsignedShortValue], 27853U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentY", [value unsignedShortValue], 37683U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWrites1ToTheOptionsAttribute_37()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:1U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"TH writes 1 to the Options attribute Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadOptionsAttribute_38()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOptionsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH read Options attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("Options", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOnCommandToDut_39()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends On command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToColorCommandToDutWithColorX327680x8000ColorY196600x4CCCTransitionTime0Immediate_40()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToColorParams alloc] init];
        params.colorX = [NSNumber numberWithUnsignedShort:32768U];
        params.colorY = [NSNumber numberWithUnsignedShort:19660U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToColorWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"TH sends MoveToColor command to DUT, with ColorX = 32768/0x8000 ColorY = 19660/0x4CCC "
                                      @"TransitionTime = 0 (immediate) Error: %@",
                                    err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_41()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentXAttributeFromDut_42()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentX attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentX", [value unsignedShortValue], 27853U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentX", [value unsignedShortValue], 37683U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_43()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentY attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentY", [value unsignedShortValue], 16711U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentY", [value unsignedShortValue], 22609U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOffCommandToDut_44()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends Off command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToColorCommandToDutWithColorX131070x3333ColorY131070x3333TransitionTime0Immediate_45()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToColorParams alloc] init];
        params.colorX = [NSNumber numberWithUnsignedShort:13107U];
        params.colorY = [NSNumber numberWithUnsignedShort:13107U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToColorWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"TH sends MoveToColor command to DUT, with ColorX = 13107/0x3333 ColorY = 13107/0x3333 "
                                      @"TransitionTime = 0 (immediate) Error: %@",
                                    err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_46()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentXAttributeFromDut_47()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentX attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentX", [value unsignedShortValue], 11141U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentX", [value unsignedShortValue], 15073U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_48()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentY attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentY", [value unsignedShortValue], 11141U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentY", [value unsignedShortValue], 15073U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToColorCommandToDutWithColorX131070x3333ColorY327680x8000TransitionTime0Immediate_49()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToColorParams alloc] init];
        params.colorX = [NSNumber numberWithUnsignedShort:13107U];
        params.colorY = [NSNumber numberWithUnsignedShort:32768U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:1U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToColorWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"TH sends MoveToColor command to DUT, with ColorX = 13107/0x3333 ColorY = 32768/0x8000 "
                                      @"TransitionTime = 0 (immediate) Error: %@",
                                    err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_50()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentXAttributeFromDut_51()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentX attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentX", actualValue, 13107U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_52()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentY attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentY", actualValue, 13107U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToColorCommandToDutWithColorX262140x6666ColorY327680x8000TransitionTime0Immediate_53()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToColorParams alloc] init];
        params.colorX = [NSNumber numberWithUnsignedShort:26214U];
        params.colorY = [NSNumber numberWithUnsignedShort:32768U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:1U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:1U];
        [cluster moveToColorWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"TH sends MoveToColor command to DUT, with ColorX = 26214/0x6666 ColorY = 32768/0x8000 "
                                      @"TransitionTime = 0 (immediate) Error: %@",
                                    err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_54()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentXAttributeFromDut_55()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentX attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentX", [value unsignedShortValue], 22282U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentX", [value unsignedShortValue], 30146U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_56()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentY attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentY", [value unsignedShortValue], 27853U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentY", [value unsignedShortValue], 37683U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorModeAttributeFromDut_57()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorMode attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ColorMode", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("colorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("colorMode", [value unsignedCharValue], 2U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsEnhancedColorModeAttributeFromDut_58()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedColorMode attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("EnhancedColorMode", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("enhancedColorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("enhancedColorMode", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_5_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_CC_5_2()
        : TestCommandBridge("Test_TC_CC_5_2")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_CC_5_2() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_CC_5_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_CC_5_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH writes 0 to the Options attribute\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThWrites0ToTheOptionsAttribute_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH sends On command to DUT\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool,
                " ***** Test Step 3 : TH sends MoveToColor command to DUT, with ColorX = 33000 ColorY = 26000 TransitionTime = 0 "
                "(immediate)\n");
            if (ShouldSkip("CC.S.F03 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToColorCommandToDutWithColorX33000ColorY26000TransitionTime0Immediate_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Wait 100ms\n");
            err = TestWait100ms_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH sends MoveColor command to DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveColorCommandToDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Wait 10s\n");
            err = TestWait10s_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH reads CurrentX attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentXAttributeFromDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : TH reads CurrentY attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentYAttributeFromDut_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Wait 10s\n");
            err = TestWait10s_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : TH reads CurrentX attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentXAttributeFromDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : TH reads CurrentY attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentYAttributeFromDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Wait 10s\n");
            err = TestWait10s_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : TH reads CurrentX attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentXAttributeFromDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : TH reads CurrentY attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentYAttributeFromDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : TH sends StopMoveStep command to DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.C47.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsStopMoveStepCommandToDut_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : TH reads CurrentX attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentXAttributeFromDut_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : TH reads CurrentY attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentYAttributeFromDut_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : TH reads ColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0008")) {
                NextTest();
                return;
            }
            err = TestThReadsColorModeAttributeFromDut_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : TH reads EnhancedColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A4001")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedColorModeAttributeFromDut_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Turn off light that we turned on\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestTurnOffLightThatWeTurnedOn_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Check on/off attribute value is false after off command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsFalseAfterOffCommand_21();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 22;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThWrites0ToTheOptionsAttribute_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"TH writes 0 to the Options attribute Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOnCommandToDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends On command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToColorCommandToDutWithColorX33000ColorY26000TransitionTime0Immediate_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToColorParams alloc] init];
        params.colorX = [NSNumber numberWithUnsignedShort:33000U];
        params.colorY = [NSNumber numberWithUnsignedShort:26000U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToColorWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"TH sends MoveToColor command to DUT, with ColorX = 33000 ColorY = 26000 TransitionTime = 0 "
                                      @"(immediate) Error: %@",
                                    err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_4()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThSendsMoveColorCommandToDut_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveColorParams alloc] init];
        params.rateX = [NSNumber numberWithShort:-100];
        params.rateY = [NSNumber numberWithShort:100];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveColorWithParams:params
                          completion:^(NSError * _Nullable err) {
                              NSLog(@"TH sends MoveColor command to DUT Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_6()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentXAttributeFromDut_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentX attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentX", [value unsignedShortValue], 27200U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentX", [value unsignedShortValue], 36800U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentY attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentY", [value unsignedShortValue], 22900U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentY", [value unsignedShortValue], 31100U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_9()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentXAttributeFromDut_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentX attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentX", [value unsignedShortValue], 26350U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentX", [value unsignedShortValue], 35650U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentY attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentY", [value unsignedShortValue], 23800U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentY", [value unsignedShortValue], 32200U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_12()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }
    NSNumber * _Nonnull CurrentXValue;

    CHIP_ERROR TestThReadsCurrentXAttributeFromDut_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentX attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentX", [value unsignedShortValue], 25500U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentX", [value unsignedShortValue], 34500U));
            {
                CurrentXValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull CurrentYValue;

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentY attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentY", [value unsignedShortValue], 24650U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentY", [value unsignedShortValue], 33350U));
            {
                CurrentYValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsStopMoveStepCommandToDut_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterStopMoveStepParams alloc] init];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster stopMoveStepWithParams:params
                             completion:^(NSError * _Nullable err) {
                                 NSLog(@"TH sends StopMoveStep command to DUT Error: %@", err);

                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                 NextTest();
                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentXAttributeFromDut_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentX attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentX", [value unsignedShortValue], 25500U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentX", [value unsignedShortValue], 34500U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentY attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentY", [value unsignedShortValue], 24650U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentY", [value unsignedShortValue], 33350U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorModeAttributeFromDut_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorMode attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ColorMode", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("colorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("colorMode", [value unsignedCharValue], 2U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsEnhancedColorModeAttributeFromDut_19()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedColorMode attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("EnhancedColorMode", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("enhancedColorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("enhancedColorMode", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTurnOffLightThatWeTurnedOn_20()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Turn off light that we turned on Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_21()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is false after off command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_5_3 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_CC_5_3()
        : TestCommandBridge("Test_TC_CC_5_3")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_CC_5_3() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_CC_5_3\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_CC_5_3\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH writes 0 to the Options attribute\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThWrites0ToTheOptionsAttribute_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH sends On command to DUT\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool,
                " ***** Test Step 3 : TH sends MoveToColor command to DUT, with ColorX = 33000 ColorY = 20000 TransitionTime = 0 "
                "(immediate)\n");
            if (ShouldSkip("CC.S.F03 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToColorCommandToDutWithColorX33000ColorY20000TransitionTime0Immediate_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Wait 100ms\n");
            err = TestWait100ms_4();
            break;
        case 5:
            ChipLogProgress(chipTool,
                " ***** Test Step 5 : TH sends StepColor command to DUT, with StepX = -20000, StepY = -6000, TransitionTime = 200 "
                "(20s)\n");
            if (ShouldSkip("CC.S.F03 && CC.S.C09.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsStepColorCommandToDutWithStepX20000StepY6000TransitionTime20020s_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Wait 10s\n");
            err = TestWait10s_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH reads CurrentX attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentXAttributeFromDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : TH reads CurrentY attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentYAttributeFromDut_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Wait 10s\n");
            err = TestWait10s_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : TH reads CurrentX attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentXAttributeFromDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : TH reads CurrentY attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentYAttributeFromDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Wait 5s\n");
            err = TestWait5s_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : TH reads CurrentX attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentXAttributeFromDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : TH reads CurrentY attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentYAttributeFromDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : TH reads ColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0008")) {
                NextTest();
                return;
            }
            err = TestThReadsColorModeAttributeFromDut_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : TH reads EnhancedColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A4001")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedColorModeAttributeFromDut_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Turn off light that we turned on\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestTurnOffLightThatWeTurnedOn_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Check on/off attribute value is false after off command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsFalseAfterOffCommand_18();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 19;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThWrites0ToTheOptionsAttribute_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"TH writes 0 to the Options attribute Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOnCommandToDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends On command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToColorCommandToDutWithColorX33000ColorY20000TransitionTime0Immediate_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToColorParams alloc] init];
        params.colorX = [NSNumber numberWithUnsignedShort:33000U];
        params.colorY = [NSNumber numberWithUnsignedShort:20000U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToColorWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"TH sends MoveToColor command to DUT, with ColorX = 33000 ColorY = 20000 TransitionTime = 0 "
                                      @"(immediate) Error: %@",
                                    err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_4()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThSendsStepColorCommandToDutWithStepX20000StepY6000TransitionTime20020s_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterStepColorParams alloc] init];
        params.stepX = [NSNumber numberWithShort:-20000];
        params.stepY = [NSNumber numberWithShort:-6000];
        params.transitionTime = [NSNumber numberWithUnsignedShort:200U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster stepColorWithParams:params
                          completion:^(NSError * _Nullable err) {
                              NSLog(@"TH sends StepColor command to DUT, with StepX = -20000, StepY = -6000, TransitionTime = 200 "
                                    @"(20s) Error: %@",
                                  err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_6()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentXAttributeFromDut_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentX attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentX", [value unsignedShortValue], 13000U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentX", [value unsignedShortValue], 33000U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentY attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentY", [value unsignedShortValue], 14000U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentY", [value unsignedShortValue], 20000U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_9()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentXAttributeFromDut_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentX attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentX", [value unsignedShortValue], 11050U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentX", [value unsignedShortValue], 14950U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentY attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentY", [value unsignedShortValue], 11900U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentY", [value unsignedShortValue], 16100U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait5s_12()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 5000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentXAttributeFromDut_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentX attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentX", [value unsignedShortValue], 11050U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentX", [value unsignedShortValue], 14950U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentY attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentY", [value unsignedShortValue], 11900U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentY", [value unsignedShortValue], 16100U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorModeAttributeFromDut_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorMode attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ColorMode", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("colorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("colorMode", [value unsignedCharValue], 2U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsEnhancedColorModeAttributeFromDut_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedColorMode attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("EnhancedColorMode", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("enhancedColorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("enhancedColorMode", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTurnOffLightThatWeTurnedOn_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Turn off light that we turned on Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is false after off command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_6_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_CC_6_1()
        : TestCommandBridge("Test_TC_CC_6_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_CC_6_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_CC_6_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_CC_6_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH writes 0 to the Options attribute\n");
            if (ShouldSkip("CC.S.F04 && CC.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThWrites0ToTheOptionsAttribute_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH sends On command to DUT\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : TH reads ColorTempPhysicalMinMireds attribute from DUT\n");
            if (ShouldSkip("CC.S.F04 && CC.S.A400b")) {
                NextTest();
                return;
            }
            err = TestThReadsColorTempPhysicalMinMiredsAttributeFromDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH reads ColorTempPhysicalMaxMireds attribute from DUT.\n");
            if (ShouldSkip("CC.S.F04 && CC.S.A400c")) {
                NextTest();
                return;
            }
            err = TestThReadsColorTempPhysicalMaxMiredsAttributeFromDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH reads ColorTemperatureMireds attribute from DUT.\n");
            if (ShouldSkip("CC.S.F04 && CC.S.A0007")) {
                NextTest();
                return;
            }
            err = TestThReadsColorTemperatureMiredsAttributeFromDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool,
                " ***** Test Step 6 : TH sends MoveToColorTemperature command to DUT with ColorTemperatureMireds=310 and "
                "TransitionTime=0 (immediately).\n");
            if (ShouldSkip("CC.S.F04 && CC.S.C0a.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToColorTemperatureCommandToDutWithColorTemperatureMireds310AndTransitionTime0Immediately_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Wait 100ms\n");
            err = TestWait100ms_7();
            break;
        case 8:
            ChipLogProgress(chipTool,
                " ***** Test Step 8 : TH sends MoveToColorTemperatur command to DUT with ColorTemperatureMireds=250 and "
                "TransitionTime=300 (30s).\n");
            if (ShouldSkip("CC.S.F04 && CC.S.C0a.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToColorTemperaturCommandToDutWithColorTemperatureMireds250AndTransitionTime30030s_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Wait 10s\n");
            err = TestWait10s_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : TH reads ColorTemperatureMireds attribute from DUT.\n");
            if (ShouldSkip("CC.S.F04 && CC.S.A0007 && CC.S.C0a.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsColorTemperatureMiredsAttributeFromDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Wait 10s\n");
            err = TestWait10s_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : TH reads ColorTemperatureMireds attribute from DUT.\n");
            if (ShouldSkip("CC.S.F04 && CC.S.A0007 && CC.S.C0a.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsColorTemperatureMiredsAttributeFromDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Wait 10s\n");
            err = TestWait10s_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : TH reads ColorTemperatureMireds attribute from DUT.\n");
            if (ShouldSkip("CC.S.F04 && CC.S.A0007 && CC.S.C0a.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsColorTemperatureMiredsAttributeFromDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Wait 5s\n");
            err = TestWait5s_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : TH reads ColorTemperatureMireds attribute from DUT.\n");
            if (ShouldSkip("CC.S.F04 && CC.S.A0007 && CC.S.C0a.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsColorTemperatureMiredsAttributeFromDut_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : TH reads ColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F04 && CC.S.A0008")) {
                NextTest();
                return;
            }
            err = TestThReadsColorModeAttributeFromDut_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : TH reads EnhancedColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F04 && CC.S.A4001")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedColorModeAttributeFromDut_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Turn Off light that we turned on\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestTurnOffLightThatWeTurnedOn_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Check on/off attribute value is false after off command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsFalseAfterOffCommand_20();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 21;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThWrites0ToTheOptionsAttribute_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"TH writes 0 to the Options attribute Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOnCommandToDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends On command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull ColorTempPhysicalMinMiredsValue;

    CHIP_ERROR TestThReadsColorTempPhysicalMinMiredsAttributeFromDut_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorTempPhysicalMinMiredsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorTempPhysicalMinMireds attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("colorTempPhysicalMinMireds", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("colorTempPhysicalMinMireds", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("colorTempPhysicalMinMireds", [value unsignedShortValue], 65279U));
            {
                ColorTempPhysicalMinMiredsValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull ColorTempPhysicalMaxMiredsValue;

    CHIP_ERROR TestThReadsColorTempPhysicalMaxMiredsAttributeFromDut_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorTempPhysicalMaxMiredsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorTempPhysicalMaxMireds attribute from DUT. Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("colorTempPhysicalMaxMireds", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("colorTempPhysicalMaxMireds", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("colorTempPhysicalMaxMireds", [value unsignedShortValue], 65279U));
            {
                ColorTempPhysicalMaxMiredsValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorTemperatureMiredsAttributeFromDut_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorTemperatureMiredsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorTemperatureMireds attribute from DUT. Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("colorTemperatureMireds", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>(
                "colorTemperatureMireds", [value unsignedShortValue], ColorTempPhysicalMinMiredsValue));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>(
                "colorTemperatureMireds", [value unsignedShortValue], ColorTempPhysicalMaxMiredsValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToColorTemperatureCommandToDutWithColorTemperatureMireds310AndTransitionTime0Immediately_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToColorTemperatureParams alloc] init];
        params.colorTemperatureMireds = [NSNumber numberWithUnsignedShort:310U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToColorTemperatureWithParams:params
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(@"TH sends MoveToColorTemperature command to DUT with ColorTemperatureMireds=310 "
                                                 @"and TransitionTime=0 (immediately). Error: %@",
                                               err);

                                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_7()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThSendsMoveToColorTemperaturCommandToDutWithColorTemperatureMireds250AndTransitionTime30030s_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterMoveToColorTemperatureParams alloc] init];
        params.colorTemperatureMireds = [NSNumber numberWithUnsignedShort:250U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:300U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToColorTemperatureWithParams:params
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(@"TH sends MoveToColorTemperatur command to DUT with ColorTemperatureMireds=250 "
                                                 @"and TransitionTime=300 (30s). Error: %@",
                                               err);

                                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_9()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsColorTemperatureMiredsAttributeFromDut_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorTemperatureMiredsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorTemperatureMireds attribute from DUT. Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("colorTemperatureMireds", [value unsignedShortValue], 246U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("colorTemperatureMireds", [value unsignedShortValue], 334U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_11()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsColorTemperatureMiredsAttributeFromDut_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorTemperatureMiredsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorTemperatureMireds attribute from DUT. Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("colorTemperatureMireds", [value unsignedShortValue], 230U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("colorTemperatureMireds", [value unsignedShortValue], 310U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_13()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsColorTemperatureMiredsAttributeFromDut_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorTemperatureMiredsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorTemperatureMireds attribute from DUT. Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("colorTemperatureMireds", [value unsignedShortValue], 212U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("colorTemperatureMireds", [value unsignedShortValue], 288U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait5s_15()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 5000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsColorTemperatureMiredsAttributeFromDut_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorTemperatureMiredsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorTemperatureMireds attribute from DUT. Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("colorTemperatureMireds", [value unsignedShortValue], 212U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("colorTemperatureMireds", [value unsignedShortValue], 288U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorModeAttributeFromDut_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorMode attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ColorMode", actualValue, 2U));
            }

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("colorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("colorMode", [value unsignedCharValue], 2U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsEnhancedColorModeAttributeFromDut_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedColorMode attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("EnhancedColorMode", actualValue, 2U));
            }

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("enhancedColorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("enhancedColorMode", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTurnOffLightThatWeTurnedOn_19()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Turn Off light that we turned on Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_20()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is false after off command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_7_3 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_CC_7_3()
        : TestCommandBridge("Test_TC_CC_7_3")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_CC_7_3() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_CC_7_3\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_CC_7_3\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH writes 0 to the Options attribute\n");
            if (ShouldSkip("CC.S.F01 && CC.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThWrites0ToTheOptionsAttribute_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH sends On command to DUT\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool,
                " ***** Test Step 3 : TH sends EnhancedMoveToHue command to DUT with EnhancedHue=6000, Direction=0x00 (shortest "
                "distance) and TransitionTime=0 (immediately).\n");
            if (ShouldSkip("CC.S.F01 && CC.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsEnhancedMoveToHueCommandToDutWithEnhancedHue6000Direction0x00ShortestDistanceAndTransitionTime0Immediately_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Wait 100ms\n");
            err = TestWait100ms_4();
            break;
        case 5:
            ChipLogProgress(chipTool,
                " ***** Test Step 5 : TH sends EnhancedStepHue command to DUT with StepMode=0x01 (up), StepSize=6000 and "
                "TransitionTime=300 (30s).\n");
            if (ShouldSkip("CC.S.F01 && CC.S.C42.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsEnhancedStepHueCommandToDutWithStepMode0x01UpStepSize6000AndTransitionTime30030s_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Wait 10s\n");
            err = TestWait10s_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH reads EnhancedCurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedCurrentHueAttributeFromDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Wait 10s\n");
            err = TestWait10s_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH reads EnhancedCurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedCurrentHueAttributeFromDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Wait 10s\n");
            err = TestWait10s_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : TH reads EnhancedCurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedCurrentHueAttributeFromDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Wait 5s\n");
            err = TestWait5s_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : TH reads EnhancedCurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedCurrentHueAttributeFromDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool,
                " ***** Test Step 14 : TH sends EnhancedMoveToHue command to DUT with EnhancedHue=12000, Direction=0x00 (shortest "
                "distance) and TransitionTime=0 (immediately).\n");
            if (ShouldSkip("CC.S.F01 && CC.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsEnhancedMoveToHueCommandToDutWithEnhancedHue12000Direction0x00ShortestDistanceAndTransitionTime0Immediately_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Wait 100ms\n");
            err = TestWait100ms_15();
            break;
        case 16:
            ChipLogProgress(chipTool,
                " ***** Test Step 16 : TH sends EnhancedStepHue command to DUT with StepMode=0x03 (down), StepSize=6000 and "
                "TransitionTime=300 (30s)\n");
            if (ShouldSkip("CC.S.F01 && CC.S.C42.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsEnhancedStepHueCommandToDutWithStepMode0x03DownStepSize6000AndTransitionTime30030s_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Wait 10s\n");
            err = TestWait10s_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : TH reads EnhancedCurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedCurrentHueAttributeFromDut_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Wait 10s\n");
            err = TestWait10s_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : TH reads EnhancedCurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedCurrentHueAttributeFromDut_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Wait 10s\n");
            err = TestWait10s_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : TH reads EnhancedCurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedCurrentHueAttributeFromDut_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : Wait 5s\n");
            err = TestWait5s_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : TH reads EnhancedCurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F01 && CC.S.A4000 && CC.S.C41.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedCurrentHueAttributeFromDut_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : TH reads ColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F01 && CC.S.A0008")) {
                NextTest();
                return;
            }
            err = TestThReadsColorModeAttributeFromDut_25();
            break;
        case 26:
            ChipLogProgress(chipTool, " ***** Test Step 26 : TH reads EnhancedColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F01 && CC.S.A4001")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedColorModeAttributeFromDut_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : Turn Off light that we turned on\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestTurnOffLightThatWeTurnedOn_27();
            break;
        case 28:
            ChipLogProgress(chipTool, " ***** Test Step 28 : Check on/off attribute value is false after off command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsFalseAfterOffCommand_28();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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));
            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));
            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));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 29;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThWrites0ToTheOptionsAttribute_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"TH writes 0 to the Options attribute Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOnCommandToDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends On command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestThSendsEnhancedMoveToHueCommandToDutWithEnhancedHue6000Direction0x00ShortestDistanceAndTransitionTime0Immediately_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterEnhancedMoveToHueParams alloc] init];
        params.enhancedHue = [NSNumber numberWithUnsignedShort:6000U];
        params.direction = [NSNumber numberWithUnsignedChar:0U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster enhancedMoveToHueWithParams:params
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"TH sends EnhancedMoveToHue command to DUT with EnhancedHue=6000, Direction=0x00 "
                                            @"(shortest distance) and TransitionTime=0 (immediately). Error: %@",
                                          err);

                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_4()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThSendsEnhancedStepHueCommandToDutWithStepMode0x01UpStepSize6000AndTransitionTime30030s_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterEnhancedStepHueParams alloc] init];
        params.stepMode = [NSNumber numberWithUnsignedChar:1U];
        params.stepSize = [NSNumber numberWithUnsignedShort:6000U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:300U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster enhancedStepHueWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"TH sends EnhancedStepHue command to DUT with StepMode=0x01 (up), StepSize=6000 and "
                                          @"TransitionTime=300 (30s). Error: %@",
                                        err);

                                    VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_6()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsEnhancedCurrentHueAttributeFromDut_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedCurrentHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 6800U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 9200U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_8()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsEnhancedCurrentHueAttributeFromDut_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedCurrentHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 8500U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 11500U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_10()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsEnhancedCurrentHueAttributeFromDut_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedCurrentHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 10200U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 13800U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait5s_12()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 5000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsEnhancedCurrentHueAttributeFromDut_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedCurrentHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 10200U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 13800U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestThSendsEnhancedMoveToHueCommandToDutWithEnhancedHue12000Direction0x00ShortestDistanceAndTransitionTime0Immediately_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterEnhancedMoveToHueParams alloc] init];
        params.enhancedHue = [NSNumber numberWithUnsignedShort:12000U];
        params.direction = [NSNumber numberWithUnsignedChar:0U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster enhancedMoveToHueWithParams:params
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"TH sends EnhancedMoveToHue command to DUT with EnhancedHue=12000, Direction=0x00 "
                                            @"(shortest distance) and TransitionTime=0 (immediately). Error: %@",
                                          err);

                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_15()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThSendsEnhancedStepHueCommandToDutWithStepMode0x03DownStepSize6000AndTransitionTime30030s_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterEnhancedStepHueParams alloc] init];
        params.stepMode = [NSNumber numberWithUnsignedChar:3U];
        params.stepSize = [NSNumber numberWithUnsignedShort:6000U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:300U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster enhancedStepHueWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"TH sends EnhancedStepHue command to DUT with StepMode=0x03 (down), StepSize=6000 and "
                                          @"TransitionTime=300 (30s) Error: %@",
                                        err);

                                    VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_17()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsEnhancedCurrentHueAttributeFromDut_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedCurrentHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 8500U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 11500U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_19()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsEnhancedCurrentHueAttributeFromDut_20()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedCurrentHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 6800U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 9200U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_21()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsEnhancedCurrentHueAttributeFromDut_22()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedCurrentHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 5100U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 6900U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait5s_23()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 5000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsEnhancedCurrentHueAttributeFromDut_24()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedCurrentHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 5100U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 6900U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorModeAttributeFromDut_25()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorMode attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ColorMode", actualValue, 0U));
            }

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("colorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("colorMode", [value unsignedCharValue], 2U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsEnhancedColorModeAttributeFromDut_26()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedColorMode attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("EnhancedColorMode", actualValue, 3U));
            }

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("enhancedColorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("enhancedColorMode", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTurnOffLightThatWeTurnedOn_27()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Turn Off light that we turned on Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_28()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is false after off command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_CC_7_4 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_CC_7_4()
        : TestCommandBridge("Test_TC_CC_7_4")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_CC_7_4() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_CC_7_4\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_CC_7_4\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH writes 0 to the Options attribute\n");
            if (ShouldSkip("CC.S.F01 && CC.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThWrites0ToTheOptionsAttribute_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH sends On command to DUT\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool,
                " ***** Test Step 3 : TH sends EnhancedMoveToHueAndSaturation command to DUT with EnhancedHue=20000, Saturation=50 "
                "and TransitionTime=0 (immediately)\n");
            if (ShouldSkip("CC.S.F01 && CC.S.C43.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsEnhancedMoveToHueAndSaturationCommandToDutWithEnhancedHue20000Saturation50AndTransitionTime0Immediately_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Wait 100ms\n");
            err = TestWait100ms_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH reads EnhancedCurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F01 && CC.S.A4000")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedCurrentHueAttributeFromDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F01 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool,
                " ***** Test Step 7 : TH sends EnhancedMoveToHueAndSaturation command to DUT with EnhancedHue=16000, Saturation=80 "
                "and TransitionTime=200 (20s)\n");
            if (ShouldSkip("CC.S.F01 && CC.S.C43.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsEnhancedMoveToHueAndSaturationCommandToDutWithEnhancedHue16000Saturation80AndTransitionTime20020s_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Wait 10s\n");
            err = TestWait10s_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH reads EnhancedCurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F01 && CC.S.A4000")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedCurrentHueAttributeFromDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F01 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Wait 10s\n");
            err = TestWait10s_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : TH reads EnhancedCurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F01 && CC.S.A4000")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedCurrentHueAttributeFromDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F01 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Wait 5s\n");
            err = TestWait5s_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : TH reads EnhancedCurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F01 && CC.S.A4000")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedCurrentHueAttributeFromDut_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F01 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : TH reads ColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F01 && CC.S.A0008")) {
                NextTest();
                return;
            }
            err = TestThReadsColorModeAttributeFromDut_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : TH reads EnhancedColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F01 && CC.S.A4001")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedColorModeAttributeFromDut_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Turn Off light that we turned on\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestTurnOffLightThatWeTurnedOn_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Check on/off attribute value is false after off command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsFalseAfterOffCommand_20();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 21;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThWrites0ToTheOptionsAttribute_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"TH writes 0 to the Options attribute Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOnCommandToDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends On command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestThSendsEnhancedMoveToHueAndSaturationCommandToDutWithEnhancedHue20000Saturation50AndTransitionTime0Immediately_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterEnhancedMoveToHueAndSaturationParams alloc] init];
        params.enhancedHue = [NSNumber numberWithUnsignedShort:20000U];
        params.saturation = [NSNumber numberWithUnsignedChar:50U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster
            enhancedMoveToHueAndSaturationWithParams:params
                                          completion:^(NSError * _Nullable err) {
                                              NSLog(
                                                  @"TH sends EnhancedMoveToHueAndSaturation command to DUT with EnhancedHue=20000, "
                                                  @"Saturation=50 and TransitionTime=0 (immediately) Error: %@",
                                                  err);

                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                              NextTest();
                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100ms_4()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsEnhancedCurrentHueAttributeFromDut_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedCurrentHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 17000U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 23000U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 42U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 58U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsEnhancedMoveToHueAndSaturationCommandToDutWithEnhancedHue16000Saturation80AndTransitionTime20020s_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterEnhancedMoveToHueAndSaturationParams alloc] init];
        params.enhancedHue = [NSNumber numberWithUnsignedShort:16000U];
        params.saturation = [NSNumber numberWithUnsignedChar:80U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:200U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster enhancedMoveToHueAndSaturationWithParams:params
                                               completion:^(NSError * _Nullable err) {
                                                   NSLog(@"TH sends EnhancedMoveToHueAndSaturation command to DUT with "
                                                         @"EnhancedHue=16000, Saturation=80 and TransitionTime=200 (20s) Error: %@",
                                                       err);

                                                   VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                   NextTest();
                                               }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_8()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsEnhancedCurrentHueAttributeFromDut_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedCurrentHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("enhancedCurrentHue", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 16000U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 20000U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 50U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 80U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_11()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsEnhancedCurrentHueAttributeFromDut_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedCurrentHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("enhancedCurrentHue", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 13600U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 18400U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentSaturation", [value unsignedCharValue], 68U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 92U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait5s_14()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 5000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsEnhancedCurrentHueAttributeFromDut_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedCurrentHue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("EnhancedCurrentHue", actualValue, 16000U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentSaturation attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentSaturation", actualValue, 80U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorModeAttributeFromDut_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads ColorMode attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ColorMode", actualValue, 0U));
            }

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("colorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("colorMode", [value unsignedCharValue], 2U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsEnhancedColorModeAttributeFromDut_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EnhancedColorMode attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("EnhancedColorMode", actualValue, 3U));
            }

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("enhancedColorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("enhancedColorMode", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTurnOffLightThatWeTurnedOn_19()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Turn Off light that we turned on Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_20()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is false after off command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_OPCREDS_1_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_OPCREDS_1_2()
        : TestCommandBridge("Test_TC_OPCREDS_1_2")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_OPCREDS_1_2() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_OPCREDS_1_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_OPCREDS_1_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads the ClusterRevision from DUT\n");
            err = TestThReadsTheClusterRevisionFromDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads the FeatureMap from DUT\n");
            err = TestThReadsTheFeatureMapFromDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : TH reads AttributeList from DUT\n");
            err = TestThReadsAttributeListFromDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH reads AcceptedCommandList from DUT\n");
            err = TestThReadsAcceptedCommandListFromDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH reads GeneratedCommandList from DUT\n");
            err = TestThReadsGeneratedCommandListFromDut_5();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 6;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheClusterRevisionFromDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the ClusterRevision from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheFeatureMapFromDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the FeatureMap from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAttributeListFromDut_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AttributeList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 3UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 4UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 5UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAcceptedCommandListFromDut_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AcceptedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 4UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 6UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 7UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 9UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 10UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 11UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsGeneratedCommandListFromDut_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads GeneratedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 3UL));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 5UL));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 8UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_BINFO_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_BINFO_1_1()
        : TestCommandBridge("Test_TC_BINFO_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_BINFO_1_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_BINFO_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_BINFO_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads the ClusterRevision from DUT\n");
            err = TestThReadsTheClusterRevisionFromDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads the FeatureMap from DUT\n");
            err = TestThReadsTheFeatureMapFromDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : TH reads AttributeList from DUT\n");
            err = TestThReadsAttributeListFromDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH reads optional attribute(ManufacturingDate) in attributeList\n");
            if (ShouldSkip("BINFO.S.A000b")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeManufacturingDateInAttributeList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH reads optional attribute(PartNumber) in attributeList\n");
            if (ShouldSkip("BINFO.S.A000c")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributePartNumberInAttributeList_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : TH reads optional attribute(ProductURL) in attributeList\n");
            if (ShouldSkip("BINFO.S.A000d")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeProductURLInAttributeList_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH reads optional attribute(ProductLabel) in attributeList\n");
            if (ShouldSkip("BINFO.S.A000e")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeProductLabelInAttributeList_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : TH reads optional attribute(SerialNumber) in attributeList\n");
            if (ShouldSkip("BINFO.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeSerialNumberInAttributeList_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH reads optional attribute(LocalConfigDisabled) in attributeList\n");
            if (ShouldSkip("BINFO.S.A0010")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeLocalConfigDisabledInAttributeList_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : TH reads optional attribute(Reachable) in attributeList\n");
            if (ShouldSkip("BINFO.S.A0011")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeReachableInAttributeList_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : TH reads optional attribute(UniqueID) in attributeList\n");
            if (ShouldSkip("BINFO.S.A0012")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeUniqueIDInAttributeList_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : TH1 reads AcceptedCommandList from DUT\n");
            err = TestTh1ReadsAcceptedCommandListFromDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : TH1 reads GeneratedCommandList from DUT\n");
            err = TestTh1ReadsGeneratedCommandListFromDut_13();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 14;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheClusterRevisionFromDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBasicInformation alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the ClusterRevision from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheFeatureMapFromDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBasicInformation alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the FeatureMap from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAttributeListFromDut_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBasicInformation alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AttributeList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 3UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 4UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 5UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 6UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 7UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 8UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 9UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 10UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 19UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeManufacturingDateInAttributeList_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBasicInformation alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(ManufacturingDate) in attributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 11UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributePartNumberInAttributeList_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBasicInformation alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(PartNumber) in attributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 12UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeProductURLInAttributeList_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBasicInformation alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(ProductURL) in attributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 13UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeProductLabelInAttributeList_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBasicInformation alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(ProductLabel) in attributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 14UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeSerialNumberInAttributeList_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBasicInformation alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(SerialNumber) in attributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 15UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeLocalConfigDisabledInAttributeList_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBasicInformation alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(LocalConfigDisabled) in attributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 16UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeReachableInAttributeList_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBasicInformation alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(Reachable) in attributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 17UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeUniqueIDInAttributeList_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBasicInformation alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(UniqueID) in attributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 18UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTh1ReadsAcceptedCommandListFromDut_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBasicInformation alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH1 reads AcceptedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTh1ReadsGeneratedCommandListFromDut_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBasicInformation alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH1 reads GeneratedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_CNET_1_3 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_CNET_1_3()
        : TestCommandBridge("Test_TC_CNET_1_3")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_CNET_1_3() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_CNET_1_3\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_CNET_1_3\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            if (ShouldSkip(" !CNET.S.F00 && !CNET.S.F01 && !CNET.S.F02 ")) {
                NextTest();
                return;
            }
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the global attribute: FeatureMap when CNET.S.F00 is set\n");
            if (ShouldSkip("CNET.S.F00")) {
                NextTest();
                return;
            }
            err = TestReadTheGlobalAttributeFeatureMapWhenCnetsf00IsSet_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the global attribute: FeatureMap when CNET.S.F01 is set\n");
            if (ShouldSkip("CNET.S.F01")) {
                NextTest();
                return;
            }
            err = TestReadTheGlobalAttributeFeatureMapWhenCnetsf01IsSet_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the global attribute: FeatureMap when CNET.S.F02 is set\n");
            if (ShouldSkip("CNET.S.F02")) {
                NextTest();
                return;
            }
            err = TestReadTheGlobalAttributeFeatureMapWhenCnetsf02IsSet_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_6();
            break;
        case 7:
            ChipLogProgress(chipTool,
                " ***** Test Step 7 : Read mandatory attributes in AttributeList if CNET.S.F00(WI)/CNET.S.F01(TH)/CNET.S.F02(ET) "
                "is true\n");
            if (ShouldSkip("CNET.S.F00 || CNET.S.F01 || CNET.S.F02")) {
                NextTest();
                return;
            }
            err = TestReadMandatoryAttributesInAttributeListIfCnetsf00wiCnetsf01thCnetsf02etIsTrue_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read the optional attribute(ScanMaxTimeSeconds): AttributeList\n");
            if (ShouldSkip("CNET.S.A0002")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeScanMaxTimeSecondsAttributeList_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Reading optional attribute(ConnectMaxTimeSeconds) in AttributeList\n");
            if (ShouldSkip("CNET.S.A0003")) {
                NextTest();
                return;
            }
            err = TestReadingOptionalAttributeConnectMaxTimeSecondsInAttributeList_9();
            break;
        case 10:
            ChipLogProgress(chipTool,
                " ***** Test Step 10 : Read AcceptedCommandList If DUT supports Wi-Fi/Thread related features "
                "CNET.S.F00(WI),CNET.S.F01(TH)\n");
            if (ShouldSkip("CNET.S.F00 || CNET.S.F01")) {
                NextTest();
                return;
            }
            err = TestReadAcceptedCommandListIfDutSupportsWiFiThreadRelatedFeaturesCnetsf00wicnetsf01th_10();
            break;
        case 11:
            ChipLogProgress(chipTool,
                " ***** Test Step 11 : Read AcceptedCommandList If DUT supports Wi-Fi related features (CNET.S.F00(WI) is true)\n");
            if (ShouldSkip("CNET.S.F00")) {
                NextTest();
                return;
            }
            err = TestReadAcceptedCommandListIfDutSupportsWiFiRelatedFeaturesCnetsf00wiIsTrue_11();
            break;
        case 12:
            ChipLogProgress(chipTool,
                " ***** Test Step 12 : Read AcceptedCommandList If DUT supports Thread related features(CNET.S.F01(TH) is true)\n");
            if (ShouldSkip("CNET.S.F01")) {
                NextTest();
                return;
            }
            err = TestReadAcceptedCommandListIfDutSupportsThreadRelatedFeaturesCNETSF01THIsTrue_12();
            break;
        case 13:
            ChipLogProgress(chipTool,
                " ***** Test Step 13 : Read AcceptedCommandList If DUT supports Ethernet related features(CNET.S.F02(TH) is "
                "true)\n");
            if (ShouldSkip("CNET.S.F02")) {
                NextTest();
                return;
            }
            err = TestReadAcceptedCommandListIfDutSupportsEthernetRelatedFeaturesCNETSF02THIsTrue_13();
            break;
        case 14:
            ChipLogProgress(chipTool,
                " ***** Test Step 14 : Read the GeneratedCommandList If DUT supports Wi-Fi/Thread related features(CNET.S.F00(WI) "
                "or CNET.S.F01(TH) is true)\n");
            if (ShouldSkip("CNET.S.F00 || CNET.S.F01")) {
                NextTest();
                return;
            }
            err = TestReadTheGeneratedCommandListIfDutSupportsWiFiThreadRelatedFeaturesCNETSF00WIOrCnetsf01thIsTrue_14();
            break;
        case 15:
            ChipLogProgress(chipTool,
                " ***** Test Step 15 : Read the GeneratedCommandList If DUT supports Ethernet related features(CNET.S.F02(ET) must "
                "be true)\n");
            if (ShouldSkip("CNET.S.F02")) {
                NextTest();
                return;
            }
            err = TestReadTheGeneratedCommandListIfDutSupportsEthernetRelatedFeaturesCNETSF02ETMustBeTrue_15();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 16;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMapWhenCnetsf00IsSet_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap when CNET.S.F00 is set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 1UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMapWhenCnetsf01IsSet_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap when CNET.S.F01 is set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 2UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMapWhenCnetsf02IsSet_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap when CNET.S.F02 is set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 4UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadMandatoryAttributesInAttributeListIfCnetsf00wiCnetsf01thCnetsf02etIsTrue_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read mandatory attributes in AttributeList if CNET.S.F00(WI)/CNET.S.F01(TH)/CNET.S.F02(ET) is true Error: %@",
                err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 4UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 5UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 6UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 7UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeScanMaxTimeSecondsAttributeList_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(ScanMaxTimeSeconds): AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadingOptionalAttributeConnectMaxTimeSecondsInAttributeList_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reading optional attribute(ConnectMaxTimeSeconds) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAcceptedCommandListIfDutSupportsWiFiThreadRelatedFeaturesCnetsf00wicnetsf01th_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read AcceptedCommandList If DUT supports Wi-Fi/Thread related features CNET.S.F00(WI),CNET.S.F01(TH) Error: %@",
                err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 4UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 6UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 8UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAcceptedCommandListIfDutSupportsWiFiRelatedFeaturesCnetsf00wiIsTrue_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read AcceptedCommandList If DUT supports Wi-Fi related features (CNET.S.F00(WI) is true) Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 2UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAcceptedCommandListIfDutSupportsThreadRelatedFeaturesCNETSF01THIsTrue_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read AcceptedCommandList If DUT supports Thread related features(CNET.S.F01(TH) is true) Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAcceptedCommandListIfDutSupportsEthernetRelatedFeaturesCNETSF02THIsTrue_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read AcceptedCommandList If DUT supports Ethernet related features(CNET.S.F02(TH) is true) Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGeneratedCommandListIfDutSupportsWiFiThreadRelatedFeaturesCNETSF00WIOrCnetsf01thIsTrue_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the GeneratedCommandList If DUT supports Wi-Fi/Thread related features(CNET.S.F00(WI) or CNET.S.F01(TH) "
                  @"is true) Error: %@",
                err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 5UL));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 7UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGeneratedCommandListIfDutSupportsEthernetRelatedFeaturesCNETSF02ETMustBeTrue_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the GeneratedCommandList If DUT supports Ethernet related features(CNET.S.F02(ET) must be true) Error: %@",
                err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_DESC_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_DESC_1_1()
        : TestCommandBridge("Test_TC_DESC_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_DESC_1_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_DESC_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_DESC_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_5();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 6;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 3UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_DLOG_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_DLOG_1_1()
        : TestCommandBridge("Test_TC_DLOG_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_DLOG_1_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_DLOG_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_DLOG_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads the ClusterRevision from DUT\n");
            err = TestThReadsTheClusterRevisionFromDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads the FeatureMap from DUT\n");
            err = TestThReadsTheFeatureMapFromDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : TH reads AttributeList from DUT\n");
            err = TestThReadsAttributeListFromDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH reads AcceptedCommandList from DUT\n");
            err = TestThReadsAcceptedCommandListFromDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH reads GeneratedCommandList from DUT\n");
            err = TestThReadsGeneratedCommandListFromDut_5();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 6;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheClusterRevisionFromDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDiagnosticLogs alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the ClusterRevision from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheFeatureMapFromDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDiagnosticLogs alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the FeatureMap from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAttributeListFromDut_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDiagnosticLogs alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AttributeList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAcceptedCommandListFromDut_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDiagnosticLogs alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AcceptedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(1)));
                VerifyOrReturn(CheckValue("", actualValue[0], 0UL));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsGeneratedCommandListFromDut_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDiagnosticLogs alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads GeneratedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(1)));
                VerifyOrReturn(CheckValue("", actualValue[0], 1UL));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGETH_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_DGETH_1_1()
        : TestCommandBridge("Test_TC_DGETH_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_DGETH_1_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_DGETH_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_DGETH_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads the ClusterRevision from DUT\n");
            err = TestThReadsTheClusterRevisionFromDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads the FeatureMap from DUT\n");
            if (ShouldSkip(" !DGETH.S.F00 && !DGETH.S.F01")) {
                NextTest();
                return;
            }
            err = TestThReadsTheFeatureMapFromDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Given DGETH.S.F00 ensure featuremap has the correct bit set\n");
            if (ShouldSkip("DGETH.S.F00")) {
                NextTest();
                return;
            }
            err = TestGivenDgethsf00EnsureFeaturemapHasTheCorrectBitSet_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Given DGETH.S.F01 ensure featuremap has the correct bit set\n");
            if (ShouldSkip("DGETH.S.F01")) {
                NextTest();
                return;
            }
            err = TestGivenDgethsf01EnsureFeaturemapHasTheCorrectBitSet_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH reads AttributeList from DUT\n");
            err = TestThReadsAttributeListFromDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : TH reads optional attribute(PHYRate) in AttributeList\n");
            if (ShouldSkip("DGETH.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributePHYRateInAttributeList_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH reads optional attribute(FullDuplex) in AttributeList\n");
            if (ShouldSkip("DGETH.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeFullDuplexInAttributeList_7();
            break;
        case 8:
            ChipLogProgress(chipTool,
                " ***** Test Step 8 : TH reads optional attribute(PacketRxCount) and Feature dependent(DGETH.S.F00(PKTCNT)) in "
                "AttributeList\n");
            if (ShouldSkip("DGETH.S.A0002")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributePacketRxCountAndFeatureDependentDGETHSF00PKTCNTInAttributeList_8();
            break;
        case 9:
            ChipLogProgress(chipTool,
                " ***** Test Step 9 : TH reads optional attribute(PacketRxCount) and Feature dependent(DGETH.S.F00(PKTCNT)) in "
                "AttributeList\n");
            if (ShouldSkip("DGETH.S.A0003")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributePacketRxCountAndFeatureDependentDGETHSF00PKTCNTInAttributeList_9();
            break;
        case 10:
            ChipLogProgress(chipTool,
                " ***** Test Step 10 : TH reads optional attribute(PacketRxCount) and Feature dependent(DGETH.S.F01(ERRCNT)) in "
                "AttributeList\n");
            if (ShouldSkip("DGETH.S.A0004")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributePacketRxCountAndFeatureDependentDGETHSF01ERRCNTInAttributeList_10();
            break;
        case 11:
            ChipLogProgress(chipTool,
                " ***** Test Step 11 : TH reads optional attribute(PacketRxCount) and Feature dependent(DGETH.S.F01(ERRCNT)) in "
                "AttributeList\n");
            if (ShouldSkip("DGETH.S.A0005")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributePacketRxCountAndFeatureDependentDGETHSF01ERRCNTInAttributeList_11();
            break;
        case 12:
            ChipLogProgress(chipTool,
                " ***** Test Step 12 : TH reads optional attribute(PacketRxCount) and Feature dependent(DGETH.S.F01(ERRCNT)) in "
                "AttributeList\n");
            if (ShouldSkip("DGETH.S.A0006")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributePacketRxCountAndFeatureDependentDGETHSF01ERRCNTInAttributeList_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : TH reads optional attribute(CarrierDetect) in AttributeList\n");
            if (ShouldSkip("DGETH.S.A0007")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeCarrierDetectInAttributeList_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : TH reads optional attribute(TimeSinceReset) in AttributeList\n");
            if (ShouldSkip("DGETH.S.A0008")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeTimeSinceResetInAttributeList_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : TH reads AcceptedCommandList from DUT\n");
            if (ShouldSkip("DGETH.S.F00 || DGETH.S.F01")) {
                NextTest();
                return;
            }
            err = TestThReadsAcceptedCommandListFromDut_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : TH reads AcceptedCommandList from DUT\n");
            if (ShouldSkip(" !DGETH.S.F00 && !DGETH.S.F01 ")) {
                NextTest();
                return;
            }
            err = TestThReadsAcceptedCommandListFromDut_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : TH reads GeneratedCommandList from DUT\n");
            err = TestThReadsGeneratedCommandListFromDut_17();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 18;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheClusterRevisionFromDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the ClusterRevision from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheFeatureMapFromDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the FeatureMap from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenDgethsf00EnsureFeaturemapHasTheCorrectBitSet_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given DGETH.S.F00 ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenDgethsf01EnsureFeaturemapHasTheCorrectBitSet_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given DGETH.S.F01 ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAttributeListFromDut_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AttributeList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributePHYRateInAttributeList_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(PHYRate) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeFullDuplexInAttributeList_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(FullDuplex) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributePacketRxCountAndFeatureDependentDGETHSF00PKTCNTInAttributeList_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(
                @"TH reads optional attribute(PacketRxCount) and Feature dependent(DGETH.S.F00(PKTCNT)) in AttributeList Error: %@",
                err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributePacketRxCountAndFeatureDependentDGETHSF00PKTCNTInAttributeList_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(
                @"TH reads optional attribute(PacketRxCount) and Feature dependent(DGETH.S.F00(PKTCNT)) in AttributeList Error: %@",
                err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributePacketRxCountAndFeatureDependentDGETHSF01ERRCNTInAttributeList_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(
                @"TH reads optional attribute(PacketRxCount) and Feature dependent(DGETH.S.F01(ERRCNT)) in AttributeList Error: %@",
                err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 4UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributePacketRxCountAndFeatureDependentDGETHSF01ERRCNTInAttributeList_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(
                @"TH reads optional attribute(PacketRxCount) and Feature dependent(DGETH.S.F01(ERRCNT)) in AttributeList Error: %@",
                err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 5UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributePacketRxCountAndFeatureDependentDGETHSF01ERRCNTInAttributeList_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(
                @"TH reads optional attribute(PacketRxCount) and Feature dependent(DGETH.S.F01(ERRCNT)) in AttributeList Error: %@",
                err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 6UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeCarrierDetectInAttributeList_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(CarrierDetect) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 7UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeTimeSinceResetInAttributeList_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(TimeSinceReset) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 8UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAcceptedCommandListFromDut_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AcceptedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAcceptedCommandListFromDut_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AcceptedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsGeneratedCommandListFromDut_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads GeneratedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGETH_2_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_DGETH_2_1()
        : TestCommandBridge("Test_TC_DGETH_2_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_DGETH_2_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_DGETH_2_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_DGETH_2_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read PHYRate attribute constraints\n");
            if (ShouldSkip("DGETH.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadPHYRateAttributeConstraints_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read FullDuplex attribute constraints\n");
            if (ShouldSkip("DGETH.S.A0001")) {
                NextTest();
                return;
            }
            err = TestReadFullDuplexAttributeConstraints_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read PacketRxCount attribute constraints\n");
            if (ShouldSkip("DGETH.S.A0002")) {
                NextTest();
                return;
            }
            err = TestReadPacketRxCountAttributeConstraints_3();
            break;
        case 4:
            ChipLogProgress(chipTool,
                " ***** Test Step 4 : Read PacketRxCount value from DUT and verify the number of packets received on ethernet "
                "network interface\n");
            if (ShouldSkip("PICS_USER_PROMPT && DGETH.S.A0002")) {
                NextTest();
                return;
            }
            err = TestReadPacketRxCountValueFromDutAndVerifyTheNumberOfPacketsReceivedOnEthernetNetworkInterface_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read PacketTxCount attribute constraints\n");
            if (ShouldSkip("DGETH.S.A0003")) {
                NextTest();
                return;
            }
            err = TestReadPacketTxCountAttributeConstraints_5();
            break;
        case 6:
            ChipLogProgress(chipTool,
                " ***** Test Step 6 : Read PacketTxCount value from DUT and verify the number of packets received on ethernet "
                "network interface\n");
            if (ShouldSkip("PICS_USER_PROMPT && DGETH.S.A0003")) {
                NextTest();
                return;
            }
            err = TestReadPacketTxCountValueFromDutAndVerifyTheNumberOfPacketsReceivedOnEthernetNetworkInterface_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read TxErrCount attribute constraints\n");
            if (ShouldSkip("DGETH.S.A0004")) {
                NextTest();
                return;
            }
            err = TestReadTxErrCountAttributeConstraints_7();
            break;
        case 8:
            ChipLogProgress(chipTool,
                " ***** Test Step 8 : Read TxErrCount value from DUT and verify value indicates the number of failed packet "
                "transmission on ethernet network interface\n");
            if (ShouldSkip("PICS_USER_PROMPT && DGETH.S.A0004")) {
                NextTest();
                return;
            }
            err = TestReadTxErrCountValueFromDutAndVerifyValueIndicatesTheNumberOfFailedPacketTransmissionOnEthernetNetworkInterface_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Read CollisionCount attribute constraints\n");
            if (ShouldSkip("DGETH.S.A0005")) {
                NextTest();
                return;
            }
            err = TestReadCollisionCountAttributeConstraints_9();
            break;
        case 10:
            ChipLogProgress(chipTool,
                " ***** Test Step 10 : Read CollisionCount value from DUT and verify value indicates the number of collision "
                "occurred while transmitting packets on ethernet network interface\n");
            if (ShouldSkip("PICS_USER_PROMPT && DGETH.S.A0005")) {
                NextTest();
                return;
            }
            err = TestReadCollisionCountValueFromDutAndVerifyValueIndicatesTheNumberOfCollisionOccurredWhileTransmittingPacketsOnEthernetNetworkInterface_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Read OverrunCount attribute constraints\n");
            if (ShouldSkip("DGETH.S.A0006")) {
                NextTest();
                return;
            }
            err = TestReadOverrunCountAttributeConstraints_11();
            break;
        case 12:
            ChipLogProgress(chipTool,
                " ***** Test Step 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\n");
            if (ShouldSkip("PICS_USER_PROMPT && DGETH.S.A0006")) {
                NextTest();
                return;
            }
            err = TestReadOverrunCountValueFromDutAndVerifyValueIndicatesTheNumberOfPacketsDroppedDueToLackOfBufferMemoryOnEthernetNetworkInterface_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Read CarrierDetect attribute constraints\n");
            if (ShouldSkip("DGETH.S.A0007")) {
                NextTest();
                return;
            }
            err = TestReadCarrierDetectAttributeConstraints_13();
            break;
        case 14:
            ChipLogProgress(chipTool,
                " ***** Test Step 14 : Read CarrierDetect value from DUT and verify value indicates the presence of carrier detect "
                "control signal on ethernet network interface\n");
            if (ShouldSkip("PICS_USER_PROMPT && DGETH.S.A0007")) {
                NextTest();
                return;
            }
            err = TestReadCarrierDetectValueFromDutAndVerifyValueIndicatesThePresenceOfCarrierDetectControlSignalOnEthernetNetworkInterface_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Read TimeSinceReset attribute constraints\n");
            if (ShouldSkip("DGETH.S.A0008")) {
                NextTest();
                return;
            }
            err = TestReadTimeSinceResetAttributeConstraints_15();
            break;
        case 16:
            ChipLogProgress(chipTool,
                " ***** Test Step 16 : Read TimeSinceReset value from DUT and verify the value indicates the duration of time, in "
                "minutes\n");
            if (ShouldSkip("PICS_USER_PROMPT && DGETH.S.A0008")) {
                NextTest();
                return;
            }
            err = TestReadTimeSinceResetValueFromDutAndVerifyTheValueIndicatesTheDurationOfTimeInMinutes_16();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 17;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadPHYRateAttributeConstraints_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePHYRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read PHYRate attribute constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("PHYRate", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("PHYRate", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("PHYRate", [value unsignedCharValue], 9U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadFullDuplexAttributeConstraints_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFullDuplexWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read FullDuplex attribute constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("fullDuplex", "boolean", "boolean"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadPacketRxCountAttributeConstraints_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePacketRxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read PacketRxCount attribute constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("packetRxCount", "int64u", "int64u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadPacketRxCountValueFromDutAndVerifyTheNumberOfPacketsReceivedOnEthernetNetworkInterface_4()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestReadPacketTxCountAttributeConstraints_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePacketTxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read PacketTxCount attribute constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("packetTxCount", "int64u", "int64u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadPacketTxCountValueFromDutAndVerifyTheNumberOfPacketsReceivedOnEthernetNetworkInterface_6()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestReadTxErrCountAttributeConstraints_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTxErrCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read TxErrCount attribute constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("txErrCount", "int64u", "int64u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestReadTxErrCountValueFromDutAndVerifyValueIndicatesTheNumberOfFailedPacketTransmissionOnEthernetNetworkInterface_8()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestReadCollisionCountAttributeConstraints_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCollisionCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read CollisionCount attribute constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("collisionCount", "int64u", "int64u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestReadCollisionCountValueFromDutAndVerifyValueIndicatesTheNumberOfCollisionOccurredWhileTransmittingPacketsOnEthernetNetworkInterface_10()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestReadOverrunCountAttributeConstraints_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOverrunCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read OverrunCount attribute constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("overrunCount", "int64u", "int64u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestReadOverrunCountValueFromDutAndVerifyValueIndicatesTheNumberOfPacketsDroppedDueToLackOfBufferMemoryOnEthernetNetworkInterface_12()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestReadCarrierDetectAttributeConstraints_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCarrierDetectWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read CarrierDetect attribute constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("carrierDetect", "boolean", "boolean"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestReadCarrierDetectValueFromDutAndVerifyValueIndicatesThePresenceOfCarrierDetectControlSignalOnEthernetNetworkInterface_14()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestReadTimeSinceResetAttributeConstraints_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTimeSinceResetWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read TimeSinceReset attribute constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("timeSinceReset", "int64u", "int64u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTimeSinceResetValueFromDutAndVerifyTheValueIndicatesTheDurationOfTimeInMinutes_16()
    {

        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("alpha", value);
    }
};

class Test_TC_DGETH_2_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_DGETH_2_2()
        : TestCommandBridge("Test_TC_DGETH_2_2")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_DGETH_2_2() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_DGETH_2_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_DGETH_2_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads PHYRate attribute from DUT\n");
            if (ShouldSkip("DGETH.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsPHYRateAttributeFromDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads PHYRate attribute from DUT\n");
            if (ShouldSkip("DGETH.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsPHYRateAttributeFromDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : TH reads PHYRate attribute from DUT\n");
            if (ShouldSkip("DGETH.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsPHYRateAttributeFromDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH reads PHYRate attribute from DUT\n");
            if (ShouldSkip("DGETH.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsPHYRateAttributeFromDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH reads PHYRate attribute from DUT\n");
            if (ShouldSkip("DGETH.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsPHYRateAttributeFromDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : TH reads PHYRate attribute from DUT\n");
            if (ShouldSkip("DGETH.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsPHYRateAttributeFromDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH reads PHYRate attribute from DUT\n");
            if (ShouldSkip("DGETH.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsPHYRateAttributeFromDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : TH reads PHYRate attribute from DUT\n");
            if (ShouldSkip("DGETH.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsPHYRateAttributeFromDut_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH reads PHYRate attribute from DUT\n");
            if (ShouldSkip("DGETH.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsPHYRateAttributeFromDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : TH reads PHYRate attribute from DUT\n");
            if (ShouldSkip("DGETH.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsPHYRateAttributeFromDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : TH reads PacketRxCount attribute value from DUT\n");
            if (ShouldSkip("DGETH.S.A0002")) {
                NextTest();
                return;
            }
            err = TestThReadsPacketRxCountAttributeValueFromDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : TH reads PacketTxCount attribute value from DUT\n");
            if (ShouldSkip("DGETH.S.A0003")) {
                NextTest();
                return;
            }
            err = TestThReadsPacketTxCountAttributeValueFromDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : TH reads TxErrCount attribute value from DUT\n");
            if (ShouldSkip("DGETH.S.A0004")) {
                NextTest();
                return;
            }
            err = TestThReadsTxErrCountAttributeValueFromDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : TH reads CollisionCount attribute value from DUT\n");
            if (ShouldSkip("DGETH.S.A0005")) {
                NextTest();
                return;
            }
            err = TestThReadsCollisionCountAttributeValueFromDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : TH reads OverrunCount attribute value from DUT\n");
            if (ShouldSkip("DGETH.S.A0006")) {
                NextTest();
                return;
            }
            err = TestThReadsOverrunCountAttributeValueFromDut_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Sends ResetCounts command\n");
            if (ShouldSkip("DGETH.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsResetCountsCommand_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : TH reads PacketRxCount attribute value from DUT\n");
            if (ShouldSkip("DGETH.S.A0002")) {
                NextTest();
                return;
            }
            err = TestThReadsPacketRxCountAttributeValueFromDut_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : TH reads PacketTxCount attribute value from DUT\n");
            if (ShouldSkip("DGETH.S.A0003")) {
                NextTest();
                return;
            }
            err = TestThReadsPacketTxCountAttributeValueFromDut_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : TH reads TxErrCount attribute value from DUT\n");
            if (ShouldSkip("DGETH.S.A0004")) {
                NextTest();
                return;
            }
            err = TestThReadsTxErrCountAttributeValueFromDut_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : TH reads CollisionCount attribute value from DUT\n");
            if (ShouldSkip("DGETH.S.A0005")) {
                NextTest();
                return;
            }
            err = TestThReadsCollisionCountAttributeValueFromDut_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : TH reads OverrunCount attribute value from DUT\n");
            if (ShouldSkip("DGETH.S.A0006")) {
                NextTest();
                return;
            }
            err = TestThReadsOverrunCountAttributeValueFromDut_21();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 22;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsPHYRateAttributeFromDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePHYRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads PHYRate attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("PHYRate", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("PHYRate", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("PHYRate", [value unsignedCharValue], 9U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsPHYRateAttributeFromDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePHYRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads PHYRate attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("PHYRate", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("PHYRate", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("PHYRate", [value unsignedCharValue], 9U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsPHYRateAttributeFromDut_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePHYRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads PHYRate attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("PHYRate", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("PHYRate", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("PHYRate", [value unsignedCharValue], 9U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsPHYRateAttributeFromDut_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePHYRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads PHYRate attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("PHYRate", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("PHYRate", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("PHYRate", [value unsignedCharValue], 9U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsPHYRateAttributeFromDut_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePHYRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads PHYRate attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("PHYRate", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("PHYRate", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("PHYRate", [value unsignedCharValue], 9U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsPHYRateAttributeFromDut_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePHYRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads PHYRate attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("PHYRate", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("PHYRate", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("PHYRate", [value unsignedCharValue], 9U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsPHYRateAttributeFromDut_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePHYRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads PHYRate attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("PHYRate", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("PHYRate", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("PHYRate", [value unsignedCharValue], 9U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsPHYRateAttributeFromDut_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePHYRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads PHYRate attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("PHYRate", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("PHYRate", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("PHYRate", [value unsignedCharValue], 9U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsPHYRateAttributeFromDut_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePHYRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads PHYRate attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("PHYRate", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("PHYRate", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("PHYRate", [value unsignedCharValue], 9U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsPHYRateAttributeFromDut_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePHYRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads PHYRate attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("PHYRate", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("PHYRate", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("PHYRate", [value unsignedCharValue], 9U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull PacketRxCount;

    CHIP_ERROR TestThReadsPacketRxCountAttributeValueFromDut_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePacketRxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads PacketRxCount attribute value from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                PacketRxCount = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull PacketTxCount;

    CHIP_ERROR TestThReadsPacketTxCountAttributeValueFromDut_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePacketTxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads PacketTxCount attribute value from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                PacketTxCount = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull TxErrCount;

    CHIP_ERROR TestThReadsTxErrCountAttributeValueFromDut_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTxErrCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads TxErrCount attribute value from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                TxErrCount = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull CollisionCount;

    CHIP_ERROR TestThReadsCollisionCountAttributeValueFromDut_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCollisionCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CollisionCount attribute value from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                CollisionCount = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull OverrunCount;

    CHIP_ERROR TestThReadsOverrunCountAttributeValueFromDut_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOverrunCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads OverrunCount attribute value from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                OverrunCount = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendsResetCountsCommand_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster resetCountsWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Sends ResetCounts command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsPacketRxCountAttributeValueFromDut_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePacketRxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads PacketRxCount attribute value from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMaxValue<uint64_t>("packetRxCount", [value unsignedLongLongValue], PacketRxCount));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsPacketTxCountAttributeValueFromDut_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePacketTxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads PacketTxCount attribute value from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMaxValue<uint64_t>("packetTxCount", [value unsignedLongLongValue], PacketTxCount));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTxErrCountAttributeValueFromDut_19()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTxErrCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads TxErrCount attribute value from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMaxValue<uint64_t>("txErrCount", [value unsignedLongLongValue], TxErrCount));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCollisionCountAttributeValueFromDut_20()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCollisionCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CollisionCount attribute value from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMaxValue<uint64_t>("collisionCount", [value unsignedLongLongValue], CollisionCount));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOverrunCountAttributeValueFromDut_21()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOverrunCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads OverrunCount attribute value from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMaxValue<uint64_t>("overrunCount", [value unsignedLongLongValue], OverrunCount));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_FLW_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_FLW_1_1()
        : TestCommandBridge("Test_TC_FLW_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_FLW_1_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_FLW_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_FLW_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the optional attribute(Tolerance) in AttributeList\n");
            if (ShouldSkip("FLW.S.A0003")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeToleranceInAttributeList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_6();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 7;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 3U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeToleranceInAttributeList_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(Tolerance) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_FLW_2_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_FLW_2_1()
        : TestCommandBridge("Test_TC_FLW_2_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_FLW_2_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_FLW_2_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_FLW_2_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read the mandatory attribute: MinMeasuredValue\n");
            if (ShouldSkip("FLW.S.A0001")) {
                NextTest();
                return;
            }
            err = TestReadTheMandatoryAttributeMinMeasuredValue_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the mandatory attribute: MaxMeasuredValue\n");
            if (ShouldSkip("FLW.S.A0002")) {
                NextTest();
                return;
            }
            err = TestReadTheMandatoryAttributeMaxMeasuredValue_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the mandatory attribute: MeasuredValue\n");
            if (ShouldSkip("FLW.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadTheMandatoryAttributeMeasuredValue_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH reads from the DUT the Tolerance attribute\n");
            if (ShouldSkip("FLW.S.A0003")) {
                NextTest();
                return;
            }
            err = TestThReadsFromTheDutTheToleranceAttribute_4();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 5;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheMandatoryAttributeMinMeasuredValue_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the mandatory attribute: MinMeasuredValue Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("minMeasuredValue", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("minMeasuredValue", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("minMeasuredValue", [value unsignedShortValue], 65533U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheMandatoryAttributeMaxMeasuredValue_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the mandatory attribute: MaxMeasuredValue Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("maxMeasuredValue", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("maxMeasuredValue", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("maxMeasuredValue", [value unsignedShortValue], 65534U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheMandatoryAttributeMeasuredValue_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the mandatory attribute: MeasuredValue Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("measuredValue", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("measuredValue", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("measuredValue", [value unsignedShortValue], 65535U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFromTheDutTheToleranceAttribute_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeToleranceWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads from the DUT the Tolerance attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("tolerance", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("tolerance", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("tolerance", [value unsignedShortValue], 2048U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_FLABEL_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_FLABEL_1_1()
        : TestCommandBridge("Test_TC_FLABEL_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_FLABEL_1_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_FLABEL_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_FLABEL_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads the ClusterRevision from DUT\n");
            err = TestThReadsTheClusterRevisionFromDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads the FeatureMap from DUT\n");
            err = TestThReadsTheFeatureMapFromDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : TH reads AttributeList from DUT\n");
            err = TestThReadsAttributeListFromDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH reads AcceptedCommandList from DUT\n");
            err = TestThReadsAcceptedCommandListFromDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH reads GeneratedCommandList from DUT\n");
            err = TestThReadsGeneratedCommandListFromDut_5();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 6;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheClusterRevisionFromDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterFixedLabel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the ClusterRevision from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheFeatureMapFromDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterFixedLabel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the FeatureMap from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAttributeListFromDut_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterFixedLabel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AttributeList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAcceptedCommandListFromDut_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterFixedLabel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AcceptedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsGeneratedCommandListFromDut_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterFixedLabel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads GeneratedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_CGEN_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_CGEN_1_1()
        : TestCommandBridge("Test_TC_CGEN_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_CGEN_1_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_CGEN_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_CGEN_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_5();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 6;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 3UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 4UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 4UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 3UL));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 5UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_CGEN_2_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_CGEN_2_1()
        : TestCommandBridge("Test_TC_CGEN_2_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_CGEN_2_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_CGEN_2_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_CGEN_2_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH1 reads the BreadCrumb Attribute from the DUT\n");
            if (ShouldSkip("CGEN.S.A0000")) {
                NextTest();
                return;
            }
            err = TestTh1ReadsTheBreadCrumbAttributeFromTheDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH1 writes the BreadCrumb attribute as 1 to the DUT\n");
            if (ShouldSkip("CGEN.S.A0000")) {
                NextTest();
                return;
            }
            err = TestTh1WritesTheBreadCrumbAttributeAs1ToTheDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : TH1 reads the BreadCrumb attribute from the DUT\n");
            if (ShouldSkip("CGEN.S.A0000")) {
                NextTest();
                return;
            }
            err = TestTh1ReadsTheBreadCrumbAttributeFromTheDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH1 reads the RegulatoryConfig attribute from the DUT\n");
            if (ShouldSkip("CGEN.S.A0002")) {
                NextTest();
                return;
            }
            err = TestTh1ReadsTheRegulatoryConfigAttributeFromTheDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH1 reads the LocationCapability attribute from the DUT\n");
            if (ShouldSkip("CGEN.S.A0003")) {
                NextTest();
                return;
            }
            err = TestTh1ReadsTheLocationCapabilityAttributeFromTheDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool,
                " ***** Test Step 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\n");
            if (ShouldSkip("CGEN.S.A0001")) {
                NextTest();
                return;
            }
            err = TestTh1ReadsBasicCommissioningInfoAttributeFromDutAndVerifyThatTheBasicCommissioningInfoAttributeHasTheFollowingFieldFailSafeExpiryLengthSecondsFieldValueIsWithinADurationRangeOf0To65535_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH1 reads SupportsConcurrentConnection attribute from the DUT\n");
            if (ShouldSkip("CGEN.S.A0004")) {
                NextTest();
                return;
            }
            err = TestTh1ReadsSupportsConcurrentConnectionAttributeFromTheDut_7();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 8;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestTh1ReadsTheBreadCrumbAttributeFromTheDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBreadcrumbWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH1 reads the BreadCrumb Attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("breadcrumb", "int64u", "int64u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTh1WritesTheBreadCrumbAttributeAs1ToTheDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id breadcrumbArgument;
        breadcrumbArgument = [NSNumber numberWithUnsignedLongLong:1ULL];
        [cluster writeAttributeBreadcrumbWithValue:breadcrumbArgument
                                        completion:^(NSError * _Nullable err) {
                                            NSLog(@"TH1 writes the BreadCrumb attribute as 1 to the DUT Error: %@", err);

                                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                            NextTest();
                                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTh1ReadsTheBreadCrumbAttributeFromTheDut_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBreadcrumbWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH1 reads the BreadCrumb attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("Breadcrumb", actualValue, 1ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTh1ReadsTheRegulatoryConfigAttributeFromTheDut_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRegulatoryConfigWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH1 reads the RegulatoryConfig attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("regulatoryConfig", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("regulatoryConfig", [value unsignedCharValue], 2U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTh1ReadsTheLocationCapabilityAttributeFromTheDut_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLocationCapabilityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH1 reads the LocationCapability attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("locationCapability", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("locationCapability", [value unsignedCharValue], 2U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestTh1ReadsBasicCommissioningInfoAttributeFromDutAndVerifyThatTheBasicCommissioningInfoAttributeHasTheFollowingFieldFailSafeExpiryLengthSecondsFieldValueIsWithinADurationRangeOf0To65535_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBasicCommissioningInfoWithCompletion:^(
            MTRGeneralCommissioningClusterBasicCommissioningInfo * _Nullable value, NSError * _Nullable err) {
            NSLog(
                @"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 Error: %@",
                err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTh1ReadsSupportsConcurrentConnectionAttributeFromTheDut_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSupportsConcurrentConnectionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH1 reads SupportsConcurrentConnection attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("supportsConcurrentConnection", "boolean", "boolean"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGGEN_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_DGGEN_1_1()
        : TestCommandBridge("Test_TC_DGGEN_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_DGGEN_1_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_DGGEN_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_DGGEN_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read optional attribute(UpTime) in AttributeList\n");
            if (ShouldSkip("DGGEN.S.A0002")) {
                NextTest();
                return;
            }
            err = TestReadOptionalAttributeUpTimeInAttributeList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read optional attribute(TotalOperationalHours) in AttributeList\n");
            if (ShouldSkip("DGGEN.S.A0003")) {
                NextTest();
                return;
            }
            err = TestReadOptionalAttributeTotalOperationalHoursInAttributeList_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read optional attribute(BootReason) in AttributeList\n");
            if (ShouldSkip("DGGEN.S.A0004")) {
                NextTest();
                return;
            }
            err = TestReadOptionalAttributeBootReasonInAttributeList_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read optional attribute(ActiveHardwareFaults) in AttributeList\n");
            if (ShouldSkip("DGGEN.S.A0005")) {
                NextTest();
                return;
            }
            err = TestReadOptionalAttributeActiveHardwareFaultsInAttributeList_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read optional attribute(ActiveRadioFaults) in AttributeList\n");
            if (ShouldSkip("DGGEN.S.A0006")) {
                NextTest();
                return;
            }
            err = TestReadOptionalAttributeActiveRadioFaultsInAttributeList_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Read optional attribute(ActiveNetworkFaults) in AttributeList\n");
            if (ShouldSkip("DGGEN.S.A0007")) {
                NextTest();
                return;
            }
            err = TestReadOptionalAttributeActiveNetworkFaultsInAttributeList_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_11();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 12;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
                                                                              endpointID:@(0)
                                                                                   queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
                                                                              endpointID:@(0)
                                                                                   queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
                                                                              endpointID:@(0)
                                                                                   queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 8UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadOptionalAttributeUpTimeInAttributeList_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
                                                                              endpointID:@(0)
                                                                                   queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read optional attribute(UpTime) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadOptionalAttributeTotalOperationalHoursInAttributeList_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
                                                                              endpointID:@(0)
                                                                                   queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read optional attribute(TotalOperationalHours) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadOptionalAttributeBootReasonInAttributeList_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
                                                                              endpointID:@(0)
                                                                                   queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read optional attribute(BootReason) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 4UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadOptionalAttributeActiveHardwareFaultsInAttributeList_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
                                                                              endpointID:@(0)
                                                                                   queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read optional attribute(ActiveHardwareFaults) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 5UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadOptionalAttributeActiveRadioFaultsInAttributeList_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
                                                                              endpointID:@(0)
                                                                                   queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read optional attribute(ActiveRadioFaults) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 6UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadOptionalAttributeActiveNetworkFaultsInAttributeList_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
                                                                              endpointID:@(0)
                                                                                   queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read optional attribute(ActiveNetworkFaults) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 7UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
                                                                              endpointID:@(0)
                                                                                   queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
                                                                              endpointID:@(0)
                                                                                   queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGGEN_2_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_DGGEN_2_1()
        : TestCommandBridge("Test_TC_DGGEN_2_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_DGGEN_2_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_DGGEN_2_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_DGGEN_2_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads NetworkInterfaces structure attribute from DUT.\n");
            if (ShouldSkip("DGGEN.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsNetworkInterfacesStructureAttributeFromDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads a RebootCount attribute value from DUT.\n");
            if (ShouldSkip("DGGEN.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsARebootCountAttributeValueFromDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Reboot target device\n");
            if (ShouldSkip("PICS_SDK_CI_ONLY")) {
                NextTest();
                return;
            }
            err = TestRebootTargetDevice_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Reboot target device(DUT)\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP")) {
                NextTest();
                return;
            }
            err = TestRebootTargetDeviceDUT_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Reboot target device\n");
            if (ShouldSkip("PICS_SDK_CI_ONLY")) {
                NextTest();
                return;
            }
            err = TestRebootTargetDevice_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Reboot target device(DUT)\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP")) {
                NextTest();
                return;
            }
            err = TestRebootTargetDeviceDUT_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_7();
            break;
        case 8:
            ChipLogProgress(chipTool,
                " ***** Test Step 8 : DUT reboots and TH reads a UpTime attribute value of DUT since some arbitrary start time of "
                "DUT rebooting.\n");
            if (ShouldSkip("DGGEN.S.A0002")) {
                NextTest();
                return;
            }
            err = TestDutRebootsAndThReadsAUpTimeAttributeValueOfDutSinceSomeArbitraryStartTimeOfDutRebooting_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH reads a TotalOperationalHours attribute value from DUT.\n");
            if (ShouldSkip("DGGEN.S.A0003")) {
                NextTest();
                return;
            }
            err = TestThReadsATotalOperationalHoursAttributeValueFromDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Reboot target device\n");
            if (ShouldSkip("PICS_SDK_CI_ONLY")) {
                NextTest();
                return;
            }
            err = TestRebootTargetDevice_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Reboot target device(DUT)\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP")) {
                NextTest();
                return;
            }
            err = TestRebootTargetDeviceDUT_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : TH reads BootReason attribute value from DUT.\n");
            if (ShouldSkip("DGGEN.S.A0004")) {
                NextTest();
                return;
            }
            err = TestThReadsBootReasonAttributeValueFromDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : TH reads ActiveHardwareFaults attribute value from DUT.\n");
            if (ShouldSkip("PICS_USER_PROMPT && DGGEN.S.A0005")) {
                NextTest();
                return;
            }
            err = TestThReadsActiveHardwareFaultsAttributeValueFromDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : TH reads ActiveRadioFaults attribute value from DUT.\n");
            if (ShouldSkip("PICS_USER_PROMPT && DGGEN.S.A0006")) {
                NextTest();
                return;
            }
            err = TestThReadsActiveRadioFaultsAttributeValueFromDut_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : TH reads ActiveNetworkFaults attribute value from DUT.\n");
            if (ShouldSkip("PICS_USER_PROMPT && DGGEN.S.A0007")) {
                NextTest();
                return;
            }
            err = TestThReadsActiveNetworkFaultsAttributeValueFromDut_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : TH reads TestEventTriggersEnabled attribute value\n");
            if (ShouldSkip("PICS_USER_PROMPT && DGGEN.S.A0008")) {
                NextTest();
                return;
            }
            err = TestThReadsTestEventTriggersEnabledAttributeValue_17();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 18;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsNetworkInterfacesStructureAttributeFromDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
                                                                              endpointID:@(0)
                                                                                   queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNetworkInterfacesWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads NetworkInterfaces structure attribute from DUT. Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("networkInterfaces", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsARebootCountAttributeValueFromDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
                                                                              endpointID:@(0)
                                                                                   queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRebootCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads a RebootCount attribute value from DUT. Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("rebootCount", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("rebootCount", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("rebootCount", [value unsignedShortValue], 65535U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRebootTargetDevice_3()
    {

        chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
        return Reboot("alpha", value);
    }

    CHIP_ERROR TestRebootTargetDeviceDUT_4()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestRebootTargetDevice_5()
    {

        chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
        return Reboot("alpha", value);
    }

    CHIP_ERROR TestRebootTargetDeviceDUT_6()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_7()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestDutRebootsAndThReadsAUpTimeAttributeValueOfDutSinceSomeArbitraryStartTimeOfDutRebooting_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
                                                                              endpointID:@(0)
                                                                                   queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeUpTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"DUT reboots and TH reads a UpTime attribute value of DUT since some arbitrary start time of DUT rebooting. "
                  @"Error: %@",
                err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("upTime", "int64u", "int64u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsATotalOperationalHoursAttributeValueFromDut_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
                                                                              endpointID:@(0)
                                                                                   queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTotalOperationalHoursWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads a TotalOperationalHours attribute value from DUT. Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("totalOperationalHours", "int32u", "int32u"));
            VerifyOrReturn(CheckConstraintMinValue<uint32_t>("totalOperationalHours", [value unsignedIntValue], 0UL));
            VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("totalOperationalHours", [value unsignedIntValue], 4294967294UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRebootTargetDevice_10()
    {

        chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
        return Reboot("alpha", value);
    }

    CHIP_ERROR TestRebootTargetDeviceDUT_11()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_12()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsBootReasonAttributeValueFromDut_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
                                                                              endpointID:@(0)
                                                                                   queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBootReasonWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads BootReason attribute value from DUT. Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("bootReason", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("bootReason", [value unsignedCharValue], 6U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsActiveHardwareFaultsAttributeValueFromDut_14()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestThReadsActiveRadioFaultsAttributeValueFromDut_15()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestThReadsActiveNetworkFaultsAttributeValueFromDut_16()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestThReadsTestEventTriggersEnabledAttributeValue_17()
    {

        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("alpha", value);
    }
};

class Test_TC_I_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_I_1_1()
        : TestCommandBridge("Test_TC_I_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_I_1_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_I_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_I_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads the ClusterRevision attribute from the DUT\n");
            err = TestThReadsTheClusterRevisionAttributeFromTheDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads the FeatureMap attribute from the DUT\n");
            err = TestThReadsTheFeatureMapAttributeFromTheDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the optional command(TriggerEffect) in AcceptedCommandList\n");
            if (ShouldSkip("I.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandTriggerEffectInAcceptedCommandList_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_6();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 7;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheClusterRevisionAttributeFromTheDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the ClusterRevision attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 4U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheFeatureMapAttributeFromTheDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the FeatureMap attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalCommandTriggerEffectInAcceptedCommandList_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional command(TriggerEffect) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 64UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_I_2_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_I_2_1()
        : TestCommandBridge("Test_TC_I_2_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_I_2_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_I_2_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_I_2_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads the IdentifyTime attribute from the DUT\n");
            if (ShouldSkip("I.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsTheIdentifyTimeAttributeFromTheDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads the IdentifyType attribute from the DUT\n");
            if (ShouldSkip("I.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsTheIdentifyTypeAttributeFromTheDut_2();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 3;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheIdentifyTimeAttributeFromTheDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeIdentifyTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the IdentifyTime attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("identifyTime", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("identifyTime", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("identifyTime", [value unsignedShortValue], 65535U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheIdentifyTypeAttributeFromTheDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeIdentifyTypeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the IdentifyType attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("identifyType", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("identifyType", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("identifyType", [value unsignedCharValue], 5U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_I_2_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_I_2_2()
        : TestCommandBridge("Test_TC_I_2_2")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_I_2_2() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_I_2_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_I_2_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool,
                " ***** Test Step 1 : TH sends Identify command to DUT, with the IdentifyTime field set to 0x003c (60s).\n");
            if (ShouldSkip("I.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsIdentifyCommandToDutWithTheIdentifyTimeFieldSetTo0x003c60s_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads immediately IdentifyTime attribute from DUT\n");
            if (ShouldSkip("I.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsImmediatelyIdentifyTimeAttributeFromDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Wait 10000ms\n");
            err = TestWait10000ms_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : After 10 seconds, the TH reads IdentifyTime attribute from DUT\n");
            if (ShouldSkip("I.S.A0000")) {
                NextTest();
                return;
            }
            err = TestAfter10SecondsTheThReadsIdentifyTimeAttributeFromDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool,
                " ***** Test Step 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\n");
            if (ShouldSkip("PICS_USER_PROMPT && I.S.C01.Rsp && I.S.C00.Tx")) {
                NextTest();
                return;
            }
            err = TestThSendsIdentifyQueryCommandToDutAndVerifyIdentifyQueryResponseCommandToTHwithTheTimeoutFieldSetToAValueInTheRange0x0000To0x0032_5();
            break;
        case 6:
            ChipLogProgress(chipTool,
                " ***** Test Step 6 : TH sends Identify command to DUT, with the IdentifyTime field set to 0x0000 (stop "
                "identifying).\n");
            if (ShouldSkip("I.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsIdentifyCommandToDutWithTheIdentifyTimeFieldSetTo0x0000StopIdentifying_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH reads immediately IdentifyTime attribute from DUT\n");
            if (ShouldSkip("I.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsImmediatelyIdentifyTimeAttributeFromDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : TH writes a value of 0x000f (15s) to IdentifyTime attribute of DUT\n");
            if (ShouldSkip("I.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThWritesAValueOf0x000f15sToIdentifyTimeAttributeOfDut_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Wait 5000ms\n");
            err = TestWait5000ms_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : After 5 seconds, the TH reads IdentifyTime attribute from DUT\n");
            if (ShouldSkip("I.S.A0000")) {
                NextTest();
                return;
            }
            err = TestAfter5SecondsTheThReadsIdentifyTimeAttributeFromDut_10();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 11;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThSendsIdentifyCommandToDutWithTheIdentifyTimeFieldSetTo0x003c60s_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRIdentifyClusterIdentifyParams alloc] init];
        params.identifyTime = [NSNumber numberWithUnsignedShort:60U];
        [cluster
            identifyWithParams:params
                    completion:^(NSError * _Nullable err) {
                        NSLog(@"TH sends Identify command to DUT, with the IdentifyTime field set to 0x003c (60s). Error: %@", err);

                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                        NextTest();
                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsImmediatelyIdentifyTimeAttributeFromDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeIdentifyTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads immediately IdentifyTime attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("identifyTime", [value unsignedShortValue], 51U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("identifyTime", [value unsignedShortValue], 69U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10000ms_3()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestAfter10SecondsTheThReadsIdentifyTimeAttributeFromDut_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeIdentifyTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"After 10 seconds, the TH reads IdentifyTime attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("identifyTime", [value unsignedShortValue], 42U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("identifyTime", [value unsignedShortValue], 58U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestThSendsIdentifyQueryCommandToDutAndVerifyIdentifyQueryResponseCommandToTHwithTheTimeoutFieldSetToAValueInTheRange0x0000To0x0032_5()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestThSendsIdentifyCommandToDutWithTheIdentifyTimeFieldSetTo0x0000StopIdentifying_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRIdentifyClusterIdentifyParams alloc] init];
        params.identifyTime = [NSNumber numberWithUnsignedShort:0U];
        [cluster identifyWithParams:params
                         completion:^(NSError * _Nullable err) {
                             NSLog(@"TH sends Identify command to DUT, with the IdentifyTime field set to 0x0000 (stop "
                                   @"identifying). Error: %@",
                                 err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsImmediatelyIdentifyTimeAttributeFromDut_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeIdentifyTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads immediately IdentifyTime attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("IdentifyTime", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesAValueOf0x000f15sToIdentifyTimeAttributeOfDut_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id identifyTimeArgument;
        identifyTimeArgument = [NSNumber numberWithUnsignedShort:15U];
        [cluster writeAttributeIdentifyTimeWithValue:identifyTimeArgument
                                          completion:^(NSError * _Nullable err) {
                                              NSLog(@"TH writes a value of 0x000f (15s) to IdentifyTime attribute of DUT Error: %@",
                                                  err);

                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                              NextTest();
                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait5000ms_9()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 5000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestAfter5SecondsTheThReadsIdentifyTimeAttributeFromDut_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeIdentifyTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"After 5 seconds, the TH reads IdentifyTime attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("identifyTime", [value unsignedShortValue], 5U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("identifyTime", [value unsignedShortValue], 15U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_I_2_3 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_I_2_3()
        : TestCommandBridge("Test_TC_I_2_3")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_I_2_3() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_I_2_3\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_I_2_3\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : 1.Wait for the commissioned device to be retrieved\n");
            err = Test1WaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool,
                " ***** Test Step 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\n");
            if (ShouldSkip("I.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0x00BlinkAndTheEffectVariantFieldSetTo0x00Default_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : DUT executes a blink effect\n");
            if (ShouldSkip("PICS_USER_PROMPT && I.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestDutExecutesABlinkEffect_2();
            break;
        case 3:
            ChipLogProgress(chipTool,
                " ***** Test Step 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\n");
            if (ShouldSkip("I.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0x01BreatheAndTheEffectVariantFieldSetTo0x00Default_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : DUT executes a breathe effect\n");
            if (ShouldSkip("PICS_USER_PROMPT && I.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestDutExecutesABreatheEffect_4();
            break;
        case 5:
            ChipLogProgress(chipTool,
                " ***** Test Step 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\n");
            if (ShouldSkip("I.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0x02OkayAndTheEffectVariantFieldSetTo0x00Default_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : DUT executes an okay effect\n");
            if (ShouldSkip("PICS_USER_PROMPT && I.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestDutExecutesAnOkayEffect_6();
            break;
        case 7:
            ChipLogProgress(chipTool,
                " ***** Test Step 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\n");
            if (ShouldSkip("I.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0x0bChannelChangeAndTheEffectVariantFieldSetTo0x00Default_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : DUT executes a channel change effect\n");
            if (ShouldSkip("PICS_USER_PROMPT && I.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestDutExecutesAChannelChangeEffect_8();
            break;
        case 9:
            ChipLogProgress(chipTool,
                " ***** Test Step 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\n");
            if (ShouldSkip("I.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0x01BreatheAndTheEffectVariantFieldSetTo0x00Default_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : DUT executes a breathe effect\n");
            if (ShouldSkip("PICS_USER_PROMPT && I.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestDutExecutesABreatheEffect_10();
            break;
        case 11:
            ChipLogProgress(chipTool,
                " ***** Test Step 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\n");
            if (ShouldSkip("I.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0xfeFinishEffectAndTheEffectVariantFieldSetTo0x00Default_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : DUT stops the breathe effect after the current effect sequence\n");
            if (ShouldSkip("PICS_USER_PROMPT && I.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestDutStopsTheBreatheEffectAfterTheCurrentEffectSequence_12();
            break;
        case 13:
            ChipLogProgress(chipTool,
                " ***** Test Step 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\n");
            if (ShouldSkip("I.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0x01BreatheAndTheEffectVariantFieldSetTo0x00Default_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : DUT executes a breathe effect\n");
            if (ShouldSkip("PICS_USER_PROMPT && I.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestDutExecutesABreatheEffect_14();
            break;
        case 15:
            ChipLogProgress(chipTool,
                " ***** Test Step 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\n");
            if (ShouldSkip("I.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0xffStopEffectAndTheEffectVariantFieldSetTo0x00Default_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : DUT stops the breathe effect as soon as possible.\n");
            if (ShouldSkip("PICS_USER_PROMPT && I.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestDutStopsTheBreatheEffectAsSoonAsPossible_16();
            break;
        case 17:
            ChipLogProgress(chipTool,
                " ***** Test Step 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\n");
            if (ShouldSkip("I.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0x00BlinkAndTheEffectVariantFieldSetTo0x42Unknown_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Check DUT executes a blink effect.\n");
            if (ShouldSkip("PICS_USER_PROMPT && I.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestCheckDutExecutesABlinkEffect_18();
            break;
        case 19:
            ChipLogProgress(chipTool,
                " ***** Test Step 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\n");
            if (ShouldSkip("I.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0xffStopEffectAndTheEffectVariantFieldSetTo0x00Default_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : DUT stops any effect that may be still running as soon as possible\n");
            if (ShouldSkip("PICS_USER_PROMPT && I.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestDutStopsAnyEffectThatMayBeStillRunningAsSoonAsPossible_20();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 21;

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

    CHIP_ERROR Test1WaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR
    TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0x00BlinkAndTheEffectVariantFieldSetTo0x00Default_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRIdentifyClusterTriggerEffectParams alloc] init];
        params.effectIdentifier = [NSNumber numberWithUnsignedChar:0U];
        params.effectVariant = [NSNumber numberWithUnsignedChar:0U];
        [cluster triggerEffectWithParams:params
                              completion:^(NSError * _Nullable err) {
                                  NSLog(@"TH sends TriggerEffect command to DUT with the effect identifier field set to 0x00 blink "
                                        @"and the effect variant field set to 0x00 default Error: %@",
                                      err);

                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestDutExecutesABlinkEffect_2()
    {

        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("alpha", value);
    }

    CHIP_ERROR
    TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0x01BreatheAndTheEffectVariantFieldSetTo0x00Default_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRIdentifyClusterTriggerEffectParams alloc] init];
        params.effectIdentifier = [NSNumber numberWithUnsignedChar:1U];
        params.effectVariant = [NSNumber numberWithUnsignedChar:0U];
        [cluster triggerEffectWithParams:params
                              completion:^(NSError * _Nullable err) {
                                  NSLog(@"TH sends TriggerEffect command to DUT with the effect identifier field set to 0x01 "
                                        @"breathe and the effect variant field set to 0x00 default Error: %@",
                                      err);

                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestDutExecutesABreatheEffect_4()
    {

        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("alpha", value);
    }

    CHIP_ERROR
    TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0x02OkayAndTheEffectVariantFieldSetTo0x00Default_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRIdentifyClusterTriggerEffectParams alloc] init];
        params.effectIdentifier = [NSNumber numberWithUnsignedChar:2U];
        params.effectVariant = [NSNumber numberWithUnsignedChar:0U];
        [cluster triggerEffectWithParams:params
                              completion:^(NSError * _Nullable err) {
                                  NSLog(@"TH sends TriggerEffect command to DUT with the effect identifier field set to 0x02 okay "
                                        @"and the effect variant field set to 0x00 default Error: %@",
                                      err);

                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestDutExecutesAnOkayEffect_6()
    {

        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("alpha", value);
    }

    CHIP_ERROR
    TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0x0bChannelChangeAndTheEffectVariantFieldSetTo0x00Default_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRIdentifyClusterTriggerEffectParams alloc] init];
        params.effectIdentifier = [NSNumber numberWithUnsignedChar:11U];
        params.effectVariant = [NSNumber numberWithUnsignedChar:0U];
        [cluster triggerEffectWithParams:params
                              completion:^(NSError * _Nullable err) {
                                  NSLog(@"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 Error: %@",
                                      err);

                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestDutExecutesAChannelChangeEffect_8()
    {

        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("alpha", value);
    }

    CHIP_ERROR
    TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0x01BreatheAndTheEffectVariantFieldSetTo0x00Default_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRIdentifyClusterTriggerEffectParams alloc] init];
        params.effectIdentifier = [NSNumber numberWithUnsignedChar:1U];
        params.effectVariant = [NSNumber numberWithUnsignedChar:0U];
        [cluster triggerEffectWithParams:params
                              completion:^(NSError * _Nullable err) {
                                  NSLog(@"TH sends TriggerEffect command to DUT with the effect identifier field set to 0x01 "
                                        @"breathe and the effect variant field set to 0x00 default Error: %@",
                                      err);

                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestDutExecutesABreatheEffect_10()
    {

        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("alpha", value);
    }

    CHIP_ERROR
    TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0xfeFinishEffectAndTheEffectVariantFieldSetTo0x00Default_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRIdentifyClusterTriggerEffectParams alloc] init];
        params.effectIdentifier = [NSNumber numberWithUnsignedChar:254U];
        params.effectVariant = [NSNumber numberWithUnsignedChar:0U];
        [cluster triggerEffectWithParams:params
                              completion:^(NSError * _Nullable err) {
                                  NSLog(@"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 Error: %@",
                                      err);

                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestDutStopsTheBreatheEffectAfterTheCurrentEffectSequence_12()
    {

        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("alpha", value);
    }

    CHIP_ERROR
    TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0x01BreatheAndTheEffectVariantFieldSetTo0x00Default_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRIdentifyClusterTriggerEffectParams alloc] init];
        params.effectIdentifier = [NSNumber numberWithUnsignedChar:1U];
        params.effectVariant = [NSNumber numberWithUnsignedChar:0U];
        [cluster triggerEffectWithParams:params
                              completion:^(NSError * _Nullable err) {
                                  NSLog(@"TH sends TriggerEffect command to DUT with the effect identifier field set to 0x01 "
                                        @"breathe and the effect variant field set to 0x00 default Error: %@",
                                      err);

                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestDutExecutesABreatheEffect_14()
    {

        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("alpha", value);
    }

    CHIP_ERROR
    TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0xffStopEffectAndTheEffectVariantFieldSetTo0x00Default_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRIdentifyClusterTriggerEffectParams alloc] init];
        params.effectIdentifier = [NSNumber numberWithUnsignedChar:255U];
        params.effectVariant = [NSNumber numberWithUnsignedChar:0U];
        [cluster triggerEffectWithParams:params
                              completion:^(NSError * _Nullable err) {
                                  NSLog(@"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 Error: %@",
                                      err);

                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestDutStopsTheBreatheEffectAsSoonAsPossible_16()
    {

        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("alpha", value);
    }

    CHIP_ERROR
    TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0x00BlinkAndTheEffectVariantFieldSetTo0x42Unknown_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRIdentifyClusterTriggerEffectParams alloc] init];
        params.effectIdentifier = [NSNumber numberWithUnsignedChar:0U];
        params.effectVariant = [NSNumber numberWithUnsignedChar:66U];
        [cluster triggerEffectWithParams:params
                              completion:^(NSError * _Nullable err) {
                                  NSLog(@"TH sends TriggerEffect command to DUT with the effect identifier field set to 0x00 blink "
                                        @"and the effect variant field set to 0x42 unknown Error: %@",
                                      err);

                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckDutExecutesABlinkEffect_18()
    {

        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("alpha", value);
    }

    CHIP_ERROR
    TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0xffStopEffectAndTheEffectVariantFieldSetTo0x00Default_19()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRIdentifyClusterTriggerEffectParams alloc] init];
        params.effectIdentifier = [NSNumber numberWithUnsignedChar:255U];
        params.effectVariant = [NSNumber numberWithUnsignedChar:0U];
        [cluster triggerEffectWithParams:params
                              completion:^(NSError * _Nullable err) {
                                  NSLog(@"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 Error: %@",
                                      err);

                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestDutStopsAnyEffectThatMayBeStillRunningAsSoonAsPossible_20()
    {

        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("alpha", value);
    }
};

class Test_TC_ILL_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_ILL_1_1()
        : TestCommandBridge("Test_TC_ILL_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_ILL_1_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_ILL_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_ILL_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the optional attribute(Tolerance) in AttributeList\n");
            if (ShouldSkip("ILL.S.A0003")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeToleranceInAttributeList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the optional attribute(LightSensorType) in AttributeList\n");
            if (ShouldSkip("ILL.S.A0004")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeLightSensorTypeInAttributeList_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_7();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 8;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
                                                                                  endpointID:@(1)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 3U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
                                                                                  endpointID:@(1)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
                                                                                  endpointID:@(1)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeToleranceInAttributeList_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
                                                                                  endpointID:@(1)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(Tolerance) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeLightSensorTypeInAttributeList_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
                                                                                  endpointID:@(1)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(LightSensorType) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 4UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
                                                                                  endpointID:@(1)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
                                                                                  endpointID:@(1)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_ILL_2_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_ILL_2_1()
        : TestCommandBridge("Test_TC_ILL_2_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_ILL_2_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_ILL_2_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_ILL_2_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads MinMeasuredValue attribute from DUT\n");
            if (ShouldSkip("ILL.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsMinMeasuredValueAttributeFromDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads MaxMeasuredValue attribute from DUT\n");
            if (ShouldSkip("ILL.S.A0002")) {
                NextTest();
                return;
            }
            err = TestThReadsMaxMeasuredValueAttributeFromDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : TH reads MeasuredValue attribute from DUT\n");
            if (ShouldSkip("ILL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsMeasuredValueAttributeFromDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH reads Tolerance attribute from DUT\n");
            if (ShouldSkip("ILL.S.A0003")) {
                NextTest();
                return;
            }
            err = TestThReadsToleranceAttributeFromDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH reads LightSensorType attribute from DUT\n");
            if (ShouldSkip("ILL.S.A0004")) {
                NextTest();
                return;
            }
            err = TestThReadsLightSensorTypeAttributeFromDut_5();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 6;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsMinMeasuredValueAttributeFromDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
                                                                                  endpointID:@(1)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads MinMeasuredValue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("minMeasuredValue", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("minMeasuredValue", [value unsignedShortValue], 1U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("minMeasuredValue", [value unsignedShortValue], 65533U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsMaxMeasuredValueAttributeFromDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
                                                                                  endpointID:@(1)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads MaxMeasuredValue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("maxMeasuredValue", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("maxMeasuredValue", [value unsignedShortValue], 2U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("maxMeasuredValue", [value unsignedShortValue], 65534U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsMeasuredValueAttributeFromDut_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
                                                                                  endpointID:@(1)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads MeasuredValue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("measuredValue", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("measuredValue", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("measuredValue", [value unsignedShortValue], 65534U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsToleranceAttributeFromDut_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
                                                                                  endpointID:@(1)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeToleranceWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Tolerance attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("tolerance", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("tolerance", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("tolerance", [value unsignedShortValue], 2048U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsLightSensorTypeAttributeFromDut_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
                                                                                  endpointID:@(1)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLightSensorTypeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads LightSensorType attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("lightSensorType", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("lightSensorType", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("lightSensorType", [value unsignedCharValue], 254U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_ILL_2_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_ILL_2_2()
        : TestCommandBridge("Test_TC_ILL_2_2")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_ILL_2_2() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_ILL_2_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_ILL_2_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads MinMeasuredValue attribute from DUT\n");
            if (ShouldSkip("ILL.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsMinMeasuredValueAttributeFromDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads MaxMeasuredValue attribute from DUT\n");
            if (ShouldSkip("ILL.S.A0002")) {
                NextTest();
                return;
            }
            err = TestThReadsMaxMeasuredValueAttributeFromDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Cover the sensor or darken the room\n");
            if (ShouldSkip("PICS_USER_PROMPT")) {
                NextTest();
                return;
            }
            err = TestCoverTheSensorOrDarkenTheRoom_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Wait 1s\n");
            err = TestWait1s_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : After a few seconds, TH reads MeasuredValue attribute from DUT.\n");
            if (ShouldSkip("ILL.S.A0000 && PICS_SKIP_SAMPLE_APP")) {
                NextTest();
                return;
            }
            err = TestAfterAFewSecondsThReadsMeasuredValueAttributeFromDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Expose the sensor again to light\n");
            if (ShouldSkip("PICS_USER_PROMPT")) {
                NextTest();
                return;
            }
            err = TestExposeTheSensorAgainToLight_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Wait 1s\n");
            err = TestWait1s_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : After a few seconds, TH reads MeasuredValue attribute from DUT.\n");
            if (ShouldSkip("ILL.S.A0000 && PICS_SKIP_SAMPLE_APP")) {
                NextTest();
                return;
            }
            err = TestAfterAFewSecondsThReadsMeasuredValueAttributeFromDut_8();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 9;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }
    NSNumber * _Nullable MinMeasuredValue;

    CHIP_ERROR TestThReadsMinMeasuredValueAttributeFromDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
                                                                                  endpointID:@(1)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads MinMeasuredValue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("minMeasuredValue", "int16u", "int16u"));
            }
            {
                MinMeasuredValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nullable MaxMeasuredValue;

    CHIP_ERROR TestThReadsMaxMeasuredValueAttributeFromDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
                                                                                  endpointID:@(1)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads MaxMeasuredValue attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("maxMeasuredValue", "int16u", "int16u"));
            }
            {
                MaxMeasuredValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCoverTheSensorOrDarkenTheRoom_3()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestWait1s_4()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 1000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestAfterAFewSecondsThReadsMeasuredValueAttributeFromDut_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
                                                                                  endpointID:@(1)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"After a few seconds, TH reads MeasuredValue attribute from DUT. Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("measuredValue", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("measuredValue", [value unsignedShortValue], 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestExposeTheSensorAgainToLight_6()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestWait1s_7()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 1000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestAfterAFewSecondsThReadsMeasuredValueAttributeFromDut_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
                                                                                  endpointID:@(1)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"After a few seconds, TH reads MeasuredValue attribute from DUT. Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("measuredValue", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("measuredValue", [value unsignedShortValue], 65534U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_LVL_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_LVL_1_1()
        : TestCommandBridge("Test_TC_LVL_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_LVL_1_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_LVL_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_LVL_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            if (ShouldSkip(" !LVL.S.F00 && !LVL.S.F01 && !LVL.S.F02 ")) {
                NextTest();
                return;
            }
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Given LVL.S.F00(OO) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("LVL.S.F00")) {
                NextTest();
                return;
            }
            err = TestGivenLvlsf00ooEnsureFeaturemapHasTheCorrectBitSet_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Given LVL.S.F01(LT) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("LVL.S.F01")) {
                NextTest();
                return;
            }
            err = TestGivenLvlsf01ltEnsureFeaturemapHasTheCorrectBitSet_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Given LVL.S.F02(FQ) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("LVL.S.F02")) {
                NextTest();
                return;
            }
            err = TestGivenLvlsf02fqEnsureFeaturemapHasTheCorrectBitSet_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_6();
            break;
        case 7:
            ChipLogProgress(chipTool,
                " ***** Test Step 7 : Read the optional attribute(StartUpCurrentLevel and RemainingTime) in AttributeList\n");
            if (ShouldSkip("LVL.S.F01")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeStartUpCurrentLevelAndRemainingTimeInAttributeList_7();
            break;
        case 8:
            ChipLogProgress(chipTool,
                " ***** Test Step 8 : Read the optional attribute(CurrentFrequency, MinFrequency and MinFrequency) in "
                "AttributeList\n");
            if (ShouldSkip("LVL.S.F02")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeCurrentFrequencyMinFrequencyAndMinFrequencyInAttributeList_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Read the optional attribute(MinLevel) in AttributeList\n");
            if (ShouldSkip("LVL.S.A0002")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeMinLevelInAttributeList_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Read the optional attribute(MaxLevel) in AttributeList\n");
            if (ShouldSkip("LVL.S.A0003")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeMaxLevelInAttributeList_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Read the optional attribute(OnOffTransitionTime) in AttributeList\n");
            if (ShouldSkip("LVL.S.A0010")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeOnOffTransitionTimeInAttributeList_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Read the optional attribute(OnTransitionTime) in AttributeList\n");
            if (ShouldSkip("LVL.S.A0012")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeOnTransitionTimeInAttributeList_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Read the optional attribute(OffTransitionTime) in AttributeList\n");
            if (ShouldSkip("LVL.S.A0013")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeOffTransitionTimeInAttributeList_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Read the optional attribute(DefaultMoveRate) in AttributeList\n");
            if (ShouldSkip("LVL.S.A0014")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeDefaultMoveRateInAttributeList_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_15();
            break;
        case 16:
            ChipLogProgress(
                chipTool, " ***** Test Step 16 : Read the Feature-dependent(LVL.S.F02) command in AcceptedCommandList\n");
            if (ShouldSkip("LVL.S.F02")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentLVLSF02CommandInAcceptedCommandList_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_17();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 18;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 5U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenLvlsf00ooEnsureFeaturemapHasTheCorrectBitSet_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given LVL.S.F00(OO) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenLvlsf01ltEnsureFeaturemapHasTheCorrectBitSet_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given LVL.S.F01(LT) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenLvlsf02fqEnsureFeaturemapHasTheCorrectBitSet_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given LVL.S.F02(FQ) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 15UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 17UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeStartUpCurrentLevelAndRemainingTimeInAttributeList_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(StartUpCurrentLevel and RemainingTime) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 16384UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeCurrentFrequencyMinFrequencyAndMinFrequencyInAttributeList_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(CurrentFrequency, MinFrequency and MinFrequency) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 4UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 5UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 6UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeMinLevelInAttributeList_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(MinLevel) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeMaxLevelInAttributeList_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(MaxLevel) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeOnOffTransitionTimeInAttributeList_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(OnOffTransitionTime) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 16UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeOnTransitionTimeInAttributeList_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(OnTransitionTime) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 18UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeOffTransitionTimeInAttributeList_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(OffTransitionTime) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 19UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeDefaultMoveRateInAttributeList_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(DefaultMoveRate) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 20UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 3UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 4UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 5UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 6UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 7UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheFeatureDependentLVLSF02CommandInAcceptedCommandList_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the Feature-dependent(LVL.S.F02) command in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 8UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_LVL_2_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_LVL_2_1()
        : TestCommandBridge("Test_TC_LVL_2_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_LVL_2_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_LVL_2_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_LVL_2_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Reads the CurrentLevel attribute\n");
            if (ShouldSkip("LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadsTheCurrentLevelAttribute_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Reads the RemainingTime attribute\n");
            if (ShouldSkip("LVL.S.A0001")) {
                NextTest();
                return;
            }
            err = TestReadsTheRemainingTimeAttribute_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Reads the MinLevel attribute\n");
            if (ShouldSkip("LVL.S.A0002 && LVL.S.F01")) {
                NextTest();
                return;
            }
            err = TestReadsTheMinLevelAttribute_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Reads the MinLevel attribute\n");
            if (ShouldSkip("LVL.S.A0002 && !LVL.S.F01")) {
                NextTest();
                return;
            }
            err = TestReadsTheMinLevelAttribute_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Reads the MaxLevel attribute\n");
            if (ShouldSkip("LVL.S.A0003 && LVL.S.F01")) {
                NextTest();
                return;
            }
            err = TestReadsTheMaxLevelAttribute_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Reads the MaxLevel attribute\n");
            if (ShouldSkip("LVL.S.A0003 && !LVL.S.F01")) {
                NextTest();
                return;
            }
            err = TestReadsTheMaxLevelAttribute_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Step 4b & 4C Reads the CurrentLevel attribute\n");
            if (ShouldSkip("LVL.S.F01 && LVL.S.A0002 && LVL.S.A0003")) {
                NextTest();
                return;
            }
            err = TestStep4b4cReadsTheCurrentLevelAttribute_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Step 4b & 4C Reads the CurrentLevel attribute\n");
            if (ShouldSkip("LVL.S.A0002 && LVL.S.A0003 && !LVL.S.F01")) {
                NextTest();
                return;
            }
            err = TestStep4b4cReadsTheCurrentLevelAttribute_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Reads the CurrentFrequency attribute\n");
            if (ShouldSkip("LVL.S.A0004")) {
                NextTest();
                return;
            }
            err = TestReadsTheCurrentFrequencyAttribute_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Reads the MinFrequency attribute\n");
            if (ShouldSkip("LVL.S.A0005")) {
                NextTest();
                return;
            }
            err = TestReadsTheMinFrequencyAttribute_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Reads the MaxFrequency attribute\n");
            if (ShouldSkip("LVL.S.A0006")) {
                NextTest();
                return;
            }
            err = TestReadsTheMaxFrequencyAttribute_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Step 7b & 7C Reads the CurrentFrequency attribute\n");
            if (ShouldSkip("LVL.S.A0004 && LVL.S.A0005 && LVL.S.A0006")) {
                NextTest();
                return;
            }
            err = TestStep7b7cReadsTheCurrentFrequencyAttribute_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Reads the OnOffTransitionTime attribute\n");
            if (ShouldSkip("LVL.S.A0010")) {
                NextTest();
                return;
            }
            err = TestReadsTheOnOffTransitionTimeAttribute_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Reads the OnLevel attribute \n");
            if (ShouldSkip("LVL.S.F01 && LVL.S.A0011")) {
                NextTest();
                return;
            }
            err = TestReadsTheOnLevelAttribute_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Reads the OnLevel attribute \n");
            if (ShouldSkip("LVL.S.A0011 && !LVL.S.F01")) {
                NextTest();
                return;
            }
            err = TestReadsTheOnLevelAttribute_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Reads the OnTransitionTime attribute \n");
            if (ShouldSkip("LVL.S.A0012")) {
                NextTest();
                return;
            }
            err = TestReadsTheOnTransitionTimeAttribute_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Reads the OffTransitionTime attribute \n");
            if (ShouldSkip("LVL.S.A0013")) {
                NextTest();
                return;
            }
            err = TestReadsTheOffTransitionTimeAttribute_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Reads the DefaultMoveRate attribute \n");
            if (ShouldSkip("LVL.S.A0014")) {
                NextTest();
                return;
            }
            err = TestReadsTheDefaultMoveRateAttribute_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Reads the Options attribute \n");
            if (ShouldSkip("LVL.S.A000f")) {
                NextTest();
                return;
            }
            err = TestReadsTheOptionsAttribute_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Reads the StartUpCurrentLevel attribute \n");
            if (ShouldSkip("LVL.S.A4000")) {
                NextTest();
                return;
            }
            err = TestReadsTheStartUpCurrentLevelAttribute_20();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 21;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }
    NSNumber * _Nullable CurrentLevelValue;

    CHIP_ERROR TestReadsTheCurrentLevelAttribute_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the CurrentLevel attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("currentLevel", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentLevel", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentLevel", [value unsignedCharValue], 254U));
            }
            {
                CurrentLevelValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheRemainingTimeAttribute_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRemainingTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the RemainingTime attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("remainingTime", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("remainingTime", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("remainingTime", [value unsignedShortValue], 65535U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull MinLevelValue;

    CHIP_ERROR TestReadsTheMinLevelAttribute_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the MinLevel attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("MinLevel", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("minLevel", "int8u", "int8u"));
            {
                MinLevelValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull MinLevelFeatureMapNotSupportedValue;

    CHIP_ERROR TestReadsTheMinLevelAttribute_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the MinLevel attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("minLevel", "int8u", "int8u"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("minLevel", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("minLevel", [value unsignedCharValue], 254U));
            {
                MinLevelFeatureMapNotSupportedValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull MaxLevelValue;

    CHIP_ERROR TestReadsTheMaxLevelAttribute_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the MaxLevel attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("MaxLevel", actualValue, 254U));
            }

            VerifyOrReturn(CheckConstraintType("maxLevel", "int8u", "int8u"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("maxLevel", [value unsignedCharValue], MinLevelValue));
            {
                MaxLevelValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull MaxLevelFeatureMapNotSupportedValue;

    CHIP_ERROR TestReadsTheMaxLevelAttribute_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the MaxLevel attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("maxLevel", "int8u", "int8u"));
            VerifyOrReturn(
                CheckConstraintMinValue<uint8_t>("maxLevel", [value unsignedCharValue], MinLevelFeatureMapNotSupportedValue));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("maxLevel", [value unsignedCharValue], 254U));
            {
                MaxLevelFeatureMapNotSupportedValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestStep4b4cReadsTheCurrentLevelAttribute_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Step 4b & 4C Reads the CurrentLevel attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("currentLevel", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentLevel", [value unsignedCharValue], MinLevelValue));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentLevel", [value unsignedCharValue], MaxLevelValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestStep4b4cReadsTheCurrentLevelAttribute_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Step 4b & 4C Reads the CurrentLevel attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("currentLevel", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>(
                    "currentLevel", [value unsignedCharValue], MinLevelFeatureMapNotSupportedValue));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>(
                    "currentLevel", [value unsignedCharValue], MaxLevelFeatureMapNotSupportedValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheCurrentFrequencyAttribute_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentFrequencyWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the CurrentFrequency attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("currentFrequency", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentFrequency", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentFrequency", [value unsignedShortValue], 65535U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull MinFrequencyValue;

    CHIP_ERROR TestReadsTheMinFrequencyAttribute_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinFrequencyWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the MinFrequency attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("minFrequency", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("minFrequency", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("minFrequency", [value unsignedShortValue], 65535U));
            {
                MinFrequencyValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull MaxFrequencyValue;

    CHIP_ERROR TestReadsTheMaxFrequencyAttribute_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxFrequencyWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the MaxFrequency attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("maxFrequency", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("maxFrequency", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("maxFrequency", [value unsignedShortValue], 65535U));
            {
                MaxFrequencyValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestStep7b7cReadsTheCurrentFrequencyAttribute_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentFrequencyWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Step 7b & 7C Reads the CurrentFrequency attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("currentFrequency", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentFrequency", [value unsignedShortValue], MinFrequencyValue));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentFrequency", [value unsignedShortValue], MaxFrequencyValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheOnOffTransitionTimeAttribute_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffTransitionTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the OnOffTransitionTime attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("onOffTransitionTime", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("onOffTransitionTime", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("onOffTransitionTime", [value unsignedShortValue], 65535U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheOnLevelAttribute_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the OnLevel attribute  Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("onLevel", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("onLevel", [value unsignedCharValue], MinLevelValue));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("onLevel", [value unsignedCharValue], MaxLevelValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheOnLevelAttribute_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the OnLevel attribute  Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("onLevel", "int8u", "int8u"));
                VerifyOrReturn(
                    CheckConstraintMinValue<uint8_t>("onLevel", [value unsignedCharValue], MinLevelFeatureMapNotSupportedValue));
                VerifyOrReturn(
                    CheckConstraintMaxValue<uint8_t>("onLevel", [value unsignedCharValue], MaxLevelFeatureMapNotSupportedValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheOnTransitionTimeAttribute_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnTransitionTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the OnTransitionTime attribute  Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("onTransitionTime", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("onTransitionTime", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("onTransitionTime", [value unsignedShortValue], 65535U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheOffTransitionTimeAttribute_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOffTransitionTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the OffTransitionTime attribute  Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("offTransitionTime", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("offTransitionTime", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("offTransitionTime", [value unsignedShortValue], 65535U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheDefaultMoveRateAttribute_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeDefaultMoveRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the DefaultMoveRate attribute  Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("defaultMoveRate", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("defaultMoveRate", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("defaultMoveRate", [value unsignedCharValue], 255U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheOptionsAttribute_19()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOptionsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the Options attribute  Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("options", "bitmap8", "bitmap8"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheStartUpCurrentLevelAttribute_20()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeStartUpCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the StartUpCurrentLevel attribute  Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("startUpCurrentLevel", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("startUpCurrentLevel", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("startUpCurrentLevel", [value unsignedCharValue], 255U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_LVL_2_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_LVL_2_2()
        : TestCommandBridge("Test_TC_LVL_2_2")
        , mTestIndex(0)
    {
        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);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_LVL_2_2() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_LVL_2_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_LVL_2_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Reads the OnOffTransitionTime attribute from the DUT\n");
            if (ShouldSkip("LVL.S.A0010")) {
                NextTest();
                return;
            }
            err = TestReadsTheOnOffTransitionTimeAttributeFromTheDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : writes the OnOffTransitionTime attribute on the DUT\n");
            if (ShouldSkip("LVL.S.A0010")) {
                NextTest();
                return;
            }
            err = TestWritesTheOnOffTransitionTimeAttributeOnTheDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Reads the OnOffTransitionTime attribute from the DUT\n");
            if (ShouldSkip("LVL.S.A0010")) {
                NextTest();
                return;
            }
            err = TestReadsTheOnOffTransitionTimeAttributeFromTheDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Reads the OnLevel attribute from the DUT\n");
            if (ShouldSkip("LVL.S.A0011")) {
                NextTest();
                return;
            }
            err = TestReadsTheOnLevelAttributeFromTheDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : writes the OnLevel attribute on the DUT\n");
            if (ShouldSkip("LVL.S.A0011")) {
                NextTest();
                return;
            }
            err = TestWritesTheOnLevelAttributeOnTheDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Reads the OnLevel attribute from the DUT\n");
            if (ShouldSkip("LVL.S.A0011")) {
                NextTest();
                return;
            }
            err = TestReadsTheOnLevelAttributeFromTheDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Reads the OnTransitionTime attribute from the DUT\n");
            if (ShouldSkip("LVL.S.A0012")) {
                NextTest();
                return;
            }
            err = TestReadsTheOnTransitionTimeAttributeFromTheDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Writes the OnTransitionTime attribute on the DUT\n");
            if (ShouldSkip("LVL.S.A0012")) {
                NextTest();
                return;
            }
            err = TestWritesTheOnTransitionTimeAttributeOnTheDut_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Reads the OnTransitionTime attribute from the DUT\n");
            if (ShouldSkip("LVL.S.A0012")) {
                NextTest();
                return;
            }
            err = TestReadsTheOnTransitionTimeAttributeFromTheDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Reads the OffTransitionTime attribute from the DUT\n");
            if (ShouldSkip("LVL.S.A0013")) {
                NextTest();
                return;
            }
            err = TestReadsTheOffTransitionTimeAttributeFromTheDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Writes the OffTransitionTime attribute on the DUT\n");
            if (ShouldSkip("LVL.S.A0013")) {
                NextTest();
                return;
            }
            err = TestWritesTheOffTransitionTimeAttributeOnTheDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Reads the OffTransitionTime attribute from the DUT\n");
            if (ShouldSkip("LVL.S.A0013")) {
                NextTest();
                return;
            }
            err = TestReadsTheOffTransitionTimeAttributeFromTheDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Reads the DefaultMoveRate attribute from the DUT\n");
            if (ShouldSkip("LVL.S.A0014")) {
                NextTest();
                return;
            }
            err = TestReadsTheDefaultMoveRateAttributeFromTheDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Writes the DefaultMoveRate attribute on the DUT\n");
            if (ShouldSkip("LVL.S.A0014")) {
                NextTest();
                return;
            }
            err = TestWritesTheDefaultMoveRateAttributeOnTheDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Reads the DefaultMoveRate attribute from the DUT\n");
            if (ShouldSkip("LVL.S.A0014")) {
                NextTest();
                return;
            }
            err = TestReadsTheDefaultMoveRateAttributeFromTheDut_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Reads the StartUpCurrentLevel attribute from the DUT\n");
            if (ShouldSkip("LVL.S.A4000")) {
                NextTest();
                return;
            }
            err = TestReadsTheStartUpCurrentLevelAttributeFromTheDut_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : writes the StartUpCurrentLevel attribute on the DUT\n");
            if (ShouldSkip("LVL.S.A4000")) {
                NextTest();
                return;
            }
            err = TestWritesTheStartUpCurrentLevelAttributeOnTheDut_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : reads the StartUpCurrentLevel attribute from the DUT\n");
            if (ShouldSkip("LVL.S.A4000")) {
                NextTest();
                return;
            }
            err = TestReadsTheStartUpCurrentLevelAttributeFromTheDut_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : writes back default value of OnOffTransitionTime attribute\n");
            if (ShouldSkip("LVL.S.A0010")) {
                NextTest();
                return;
            }
            err = TestWritesBackDefaultValueOfOnOffTransitionTimeAttribute_19();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 20;

    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;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }
    NSNumber * _Nonnull OnOffTransitionTimeValue;

    CHIP_ERROR TestReadsTheOnOffTransitionTimeAttributeFromTheDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffTransitionTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the OnOffTransitionTime attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("onOffTransitionTime", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("onOffTransitionTime", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("onOffTransitionTime", [value unsignedShortValue], 65535U));
            {
                OnOffTransitionTimeValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesTheOnOffTransitionTimeAttributeOnTheDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id onOffTransitionTimeArgument;
        onOffTransitionTimeArgument = mOnOffTransitionTimeConfigValue.HasValue()
            ? [NSNumber numberWithUnsignedShort:mOnOffTransitionTimeConfigValue.Value()]
            : [NSNumber numberWithUnsignedShort:10U];
        [cluster writeAttributeOnOffTransitionTimeWithValue:onOffTransitionTimeArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"writes the OnOffTransitionTime attribute on the DUT Error: %@", err);

                                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheOnOffTransitionTimeAttributeFromTheDut_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffTransitionTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the OnOffTransitionTime attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOffTransitionTime", actualValue,
                    mOnOffTransitionTimeConfigValue.HasValue() ? mOnOffTransitionTimeConfigValue.Value() : 10U));
            }

            VerifyOrReturn(CheckConstraintType("onOffTransitionTime", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintNotValue("onOffTransitionTime", value, OnOffTransitionTimeValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nullable OnLevelValue;

    CHIP_ERROR TestReadsTheOnLevelAttributeFromTheDut_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the OnLevel attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("onLevel", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("onLevel", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("onLevel", [value unsignedCharValue], 254U));
            }
            {
                OnLevelValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesTheOnLevelAttributeOnTheDut_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id onLevelArgument;
        onLevelArgument = mOnLevelConfigValue.HasValue() ? [NSNumber numberWithUnsignedChar:mOnLevelConfigValue.Value()]
                                                         : [NSNumber numberWithUnsignedChar:5U];
        [cluster writeAttributeOnLevelWithValue:onLevelArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"writes the OnLevel attribute on the DUT Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheOnLevelAttributeFromTheDut_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the OnLevel attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("OnLevel", actualValue));
                VerifyOrReturn(
                    CheckValue("OnLevel", actualValue, mOnLevelConfigValue.HasValue() ? mOnLevelConfigValue.Value() : 5U));
            }
            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("onLevel", "int8u", "int8u"));
            }
            VerifyOrReturn(CheckConstraintNotValue("onLevel", value, OnLevelValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nullable OnTransitionTimeValue;

    CHIP_ERROR TestReadsTheOnTransitionTimeAttributeFromTheDut_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnTransitionTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the OnTransitionTime attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("onTransitionTime", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("onTransitionTime", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("onTransitionTime", [value unsignedShortValue], 65535U));
            }
            {
                OnTransitionTimeValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesTheOnTransitionTimeAttributeOnTheDut_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id onTransitionTimeArgument;
        onTransitionTimeArgument = mOnTransitionTimeConfigValue.HasValue()
            ? [NSNumber numberWithUnsignedShort:mOnTransitionTimeConfigValue.Value()]
            : [NSNumber numberWithUnsignedShort:5U];
        [cluster writeAttributeOnTransitionTimeWithValue:onTransitionTimeArgument
                                              completion:^(NSError * _Nullable err) {
                                                  NSLog(@"Writes the OnTransitionTime attribute on the DUT Error: %@", err);

                                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheOnTransitionTimeAttributeFromTheDut_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnTransitionTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the OnTransitionTime attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("OnTransitionTime", actualValue));
                VerifyOrReturn(CheckValue("OnTransitionTime", actualValue,
                    mOnTransitionTimeConfigValue.HasValue() ? mOnTransitionTimeConfigValue.Value() : 5U));
            }
            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("onTransitionTime", "int16u", "int16u"));
            }
            VerifyOrReturn(CheckConstraintNotValue("onTransitionTime", value, OnTransitionTimeValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nullable OffTransitionTimeValue;

    CHIP_ERROR TestReadsTheOffTransitionTimeAttributeFromTheDut_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOffTransitionTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the OffTransitionTime attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("offTransitionTime", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("offTransitionTime", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("offTransitionTime", [value unsignedShortValue], 65535U));
            }
            {
                OffTransitionTimeValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesTheOffTransitionTimeAttributeOnTheDut_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id offTransitionTimeArgument;
        offTransitionTimeArgument = mOffTransitionTimeConfigValue.HasValue()
            ? [NSNumber numberWithUnsignedShort:mOffTransitionTimeConfigValue.Value()]
            : [NSNumber numberWithUnsignedShort:10U];
        [cluster writeAttributeOffTransitionTimeWithValue:offTransitionTimeArgument
                                               completion:^(NSError * _Nullable err) {
                                                   NSLog(@"Writes the OffTransitionTime attribute on the DUT Error: %@", err);

                                                   VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                   NextTest();
                                               }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheOffTransitionTimeAttributeFromTheDut_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOffTransitionTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the OffTransitionTime attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("OffTransitionTime", actualValue));
                VerifyOrReturn(CheckValue("OffTransitionTime", actualValue,
                    mOffTransitionTimeConfigValue.HasValue() ? mOffTransitionTimeConfigValue.Value() : 10U));
            }
            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("offTransitionTime", "int16u", "int16u"));
            }
            VerifyOrReturn(CheckConstraintNotValue("offTransitionTime", value, OffTransitionTimeValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nullable DefaultMoveRatevalue;

    CHIP_ERROR TestReadsTheDefaultMoveRateAttributeFromTheDut_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeDefaultMoveRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the DefaultMoveRate attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("defaultMoveRate", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("defaultMoveRate", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("defaultMoveRate", [value unsignedCharValue], 255U));
            }
            {
                DefaultMoveRatevalue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesTheDefaultMoveRateAttributeOnTheDut_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id defaultMoveRateArgument;
        defaultMoveRateArgument = mDefaultMoveRateConfigValue.HasValue()
            ? [NSNumber numberWithUnsignedChar:mDefaultMoveRateConfigValue.Value()]
            : [NSNumber numberWithUnsignedChar:111U];
        [cluster writeAttributeDefaultMoveRateWithValue:defaultMoveRateArgument
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"Writes the DefaultMoveRate attribute on the DUT Error: %@", err);

                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheDefaultMoveRateAttributeFromTheDut_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeDefaultMoveRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the DefaultMoveRate attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("DefaultMoveRate", actualValue));
                VerifyOrReturn(CheckValue("DefaultMoveRate", actualValue,
                    mDefaultMoveRateConfigValue.HasValue() ? mDefaultMoveRateConfigValue.Value() : 111U));
            }
            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("defaultMoveRate", "int8u", "int8u"));
            }
            VerifyOrReturn(CheckConstraintNotValue("defaultMoveRate", value, DefaultMoveRatevalue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nullable StartUpCurrentLevelValue;

    CHIP_ERROR TestReadsTheStartUpCurrentLevelAttributeFromTheDut_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeStartUpCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the StartUpCurrentLevel attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("startUpCurrentLevel", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("startUpCurrentLevel", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("startUpCurrentLevel", [value unsignedCharValue], 255U));
            }
            {
                StartUpCurrentLevelValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesTheStartUpCurrentLevelAttributeOnTheDut_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id startUpCurrentLevelArgument;
        startUpCurrentLevelArgument = mStartUpCurrentLevelConfigValue.HasValue()
            ? [NSNumber numberWithUnsignedChar:mStartUpCurrentLevelConfigValue.Value()]
            : [NSNumber numberWithUnsignedChar:5U];
        [cluster writeAttributeStartUpCurrentLevelWithValue:startUpCurrentLevelArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"writes the StartUpCurrentLevel attribute on the DUT Error: %@", err);

                                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheStartUpCurrentLevelAttributeFromTheDut_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeStartUpCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"reads the StartUpCurrentLevel attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("StartUpCurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("StartUpCurrentLevel", actualValue,
                    mStartUpCurrentLevelConfigValue.HasValue() ? mStartUpCurrentLevelConfigValue.Value() : 5U));
            }
            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("startUpCurrentLevel", "int8u", "int8u"));
            }
            VerifyOrReturn(CheckConstraintNotValue("startUpCurrentLevel", value, StartUpCurrentLevelValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesBackDefaultValueOfOnOffTransitionTimeAttribute_19()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id onOffTransitionTimeArgument;
        onOffTransitionTimeArgument = [NSNumber numberWithUnsignedShort:0U];
        [cluster
            writeAttributeOnOffTransitionTimeWithValue:onOffTransitionTimeArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"writes back default value of OnOffTransitionTime attribute Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_LVL_3_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_LVL_3_1()
        : TestCommandBridge("Test_TC_LVL_3_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_LVL_3_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_LVL_3_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_LVL_3_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Precondition Send On Command\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestPreconditionSendOnCommand_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Check on/off attribute value is true after on command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsTrueAfterOnCommand_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Precondition: write default value of OnOffTransitionTime attribute\n");
            if (ShouldSkip("LVL.S.A0010")) {
                NextTest();
                return;
            }
            err = TestPreconditionWriteDefaultValueOfOnOffTransitionTimeAttribute_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH writes 0 to the Options attribute\n");
            if (ShouldSkip("LVL.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThWrites0ToTheOptionsAttribute_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH sends Off command to DUT\n");
            if (ShouldSkip("LVL.S.C04.Rsp && OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOffCommandToDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool,
                " ***** Test Step 6 : TH sends a MoveToLevelWithOnOff command to DUT, with Level =50 and TransitionTime =0 "
                "(immediate)\n");
            if (ShouldSkip("LVL.S.C04.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveToLevelWithOnOffCommandToDutWithLevel50AndTransitionTime0Immediate_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH reads OnOff attribute (On/Off cluster) from DUT\n");
            if (ShouldSkip("OO.S.A0000 && LVL.S.C04.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsOnOffAttributeOnOffClusterFromDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C04.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH sends On command to DUT\n");
            if (ShouldSkip("LVL.S.C04.Rsp && OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool,
                " ***** Test Step 10 : TH sends a MoveToLevel command to DUT, with Level =50 and TransitionTime =0 (immediate)\n");
            if (ShouldSkip("LVL.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveToLevelCommandToDutWithLevel50AndTransitionTime0Immediate_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool,
                " ***** Test Step 12 : TH sends a MoveToLevel command to the DUT with Level = 200 and TransitionTime = 300 (30 s). "
                "This means the level should increase by 150 units in 30s, so 5 units/s\n");
            if (ShouldSkip("LVL.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveToLevelCommandToTheDutWithLevel200AndTransitionTime30030SThisMeansTheLevelShouldIncreaseBy150UnitsIn30sSo5UnitsS_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Wait 10000ms\n");
            err = TestWait10000ms_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000 && LVL.S.M.VarRate")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Wait 10000ms\n");
            err = TestWait10000ms_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000 && LVL.S.M.VarRate")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Wait 10000ms\n");
            err = TestWait10000ms_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000 && LVL.S.M.VarRate")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Wait 5000ms\n");
            err = TestWait5000ms_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000 && LVL.S.M.VarRate")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000 && !LVL.S.M.VarRate")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : TH writes 0 to the Options attribute\n");
            if (ShouldSkip("LVL.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThWrites0ToTheOptionsAttribute_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : TH reads Options attribute\n");
            if (ShouldSkip("LVL.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionsAttribute_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : TH sends On command to DUT\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : TH sends a MoveToLevel command to the DUT with\n");
            if (ShouldSkip("LVL.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveToLevelCommandToTheDutWith_25();
            break;
        case 26:
            ChipLogProgress(chipTool, " ***** Test Step 26 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : TH sends Off command to DUT\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOffCommandToDut_27();
            break;
        case 28:
            ChipLogProgress(chipTool, " ***** Test Step 28 : TH sends a MoveToLevel command to the DUT with\n");
            if (ShouldSkip("LVL.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveToLevelCommandToTheDutWith_28();
            break;
        case 29:
            ChipLogProgress(chipTool, " ***** Test Step 29 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_29();
            break;
        case 30:
            ChipLogProgress(chipTool, " ***** Test Step 30 : TH sends a MoveToLevel command to the DUT with\n");
            if (ShouldSkip("LVL.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveToLevelCommandToTheDutWith_30();
            break;
        case 31:
            ChipLogProgress(chipTool, " ***** Test Step 31 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_31();
            break;
        case 32:
            ChipLogProgress(chipTool, " ***** Test Step 32 : TH sends a MoveToLevel command to the DUT with\n");
            if (ShouldSkip("LVL.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveToLevelCommandToTheDutWith_32();
            break;
        case 33:
            ChipLogProgress(chipTool, " ***** Test Step 33 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_33();
            break;
        case 34:
            ChipLogProgress(chipTool, " ***** Test Step 34 : TH writes 1 to the Options attribute\n");
            if (ShouldSkip("LVL.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThWrites1ToTheOptionsAttribute_34();
            break;
        case 35:
            ChipLogProgress(chipTool, " ***** Test Step 35 : TH reads Options attribute\n");
            if (ShouldSkip("LVL.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionsAttribute_35();
            break;
        case 36:
            ChipLogProgress(chipTool, " ***** Test Step 36 : TH sends On command to DUT\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_36();
            break;
        case 37:
            ChipLogProgress(chipTool, " ***** Test Step 37 : TH sends a MoveToLevel command to the DUT with\n");
            if (ShouldSkip("LVL.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveToLevelCommandToTheDutWith_37();
            break;
        case 38:
            ChipLogProgress(chipTool, " ***** Test Step 38 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_38();
            break;
        case 39:
            ChipLogProgress(chipTool, " ***** Test Step 39 : TH sends Off command to DUT\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOffCommandToDut_39();
            break;
        case 40:
            ChipLogProgress(chipTool, " ***** Test Step 40 : TH sends a MoveToLevel command to the DUT with\n");
            if (ShouldSkip("LVL.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveToLevelCommandToTheDutWith_40();
            break;
        case 41:
            ChipLogProgress(chipTool, " ***** Test Step 41 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_41();
            break;
        case 42:
            ChipLogProgress(chipTool, " ***** Test Step 42 : TH sends a MoveToLevel command to the DUT with\n");
            if (ShouldSkip("LVL.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveToLevelCommandToTheDutWith_42();
            break;
        case 43:
            ChipLogProgress(chipTool, " ***** Test Step 43 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_43();
            break;
        case 44:
            ChipLogProgress(chipTool, " ***** Test Step 44 : TH sends a MoveToLevel command to the DUT with\n");
            if (ShouldSkip("LVL.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveToLevelCommandToTheDutWith_44();
            break;
        case 45:
            ChipLogProgress(chipTool, " ***** Test Step 45 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_45();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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));
            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));
            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));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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));
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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));
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 46;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestPreconditionSendOnCommand_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Precondition Send On Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsTrueAfterOnCommand_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is true after on command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 1));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestPreconditionWriteDefaultValueOfOnOffTransitionTimeAttribute_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id onOffTransitionTimeArgument;
        onOffTransitionTimeArgument = [NSNumber numberWithUnsignedShort:0U];
        [cluster
            writeAttributeOnOffTransitionTimeWithValue:onOffTransitionTimeArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(
                                                    @"Precondition: write default value of OnOffTransitionTime attribute Error: %@",
                                                    err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWrites0ToTheOptionsAttribute_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"TH writes 0 to the Options attribute Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOffCommandToDut_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends Off command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsAMoveToLevelWithOnOffCommandToDutWithLevel50AndTransitionTime0Immediate_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterMoveToLevelWithOnOffParams alloc] init];
        params.level = [NSNumber numberWithUnsignedChar:50U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToLevelWithOnOffWithParams:params
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"TH sends a MoveToLevelWithOnOff command to DUT, with Level =50 and TransitionTime "
                                               @"=0 (immediate) Error: %@",
                                             err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOnOffAttributeOnOffClusterFromDut_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads OnOff attribute (On/Off cluster) from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 1));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 50U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOnCommandToDut_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends On command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsAMoveToLevelCommandToDutWithLevel50AndTransitionTime0Immediate_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterMoveToLevelParams alloc] init];
        params.level = [NSNumber numberWithUnsignedChar:50U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster
            moveToLevelWithParams:params
                       completion:^(NSError * _Nullable err) {
                           NSLog(
                               @"TH sends a MoveToLevel command to DUT, with Level =50 and TransitionTime =0 (immediate) Error: %@",
                               err);

                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                           NextTest();
                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 50U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestThSendsAMoveToLevelCommandToTheDutWithLevel200AndTransitionTime30030SThisMeansTheLevelShouldIncreaseBy150UnitsIn30sSo5UnitsS_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterMoveToLevelParams alloc] init];
        params.level = [NSNumber numberWithUnsignedChar:200U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:300U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToLevelWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"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 Error: %@",
                                    err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10000ms_13()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentLevel", [value unsignedCharValue], 85U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentLevel", [value unsignedCharValue], 115U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10000ms_15()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentLevel", [value unsignedCharValue], 127U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentLevel", [value unsignedCharValue], 173U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10000ms_17()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentLevel", [value unsignedCharValue], 170U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentLevel", [value unsignedCharValue], 200U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait5000ms_19()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 5000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_20()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 200U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_21()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 200U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWrites0ToTheOptionsAttribute_22()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"TH writes 0 to the Options attribute Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionsAttribute_23()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOptionsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Options attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("Options", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOnCommandToDut_24()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends On command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsAMoveToLevelCommandToTheDutWith_25()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterMoveToLevelParams alloc] init];
        params.level = [NSNumber numberWithUnsignedChar:100U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToLevelWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"TH sends a MoveToLevel command to the DUT with Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_26()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 100U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOffCommandToDut_27()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends Off command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsAMoveToLevelCommandToTheDutWith_28()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterMoveToLevelParams alloc] init];
        params.level = [NSNumber numberWithUnsignedChar:120U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToLevelWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"TH sends a MoveToLevel command to the DUT with Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_29()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 100U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsAMoveToLevelCommandToTheDutWith_30()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterMoveToLevelParams alloc] init];
        params.level = [NSNumber numberWithUnsignedChar:140U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:1U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToLevelWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"TH sends a MoveToLevel command to the DUT with Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_31()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 100U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsAMoveToLevelCommandToTheDutWith_32()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterMoveToLevelParams alloc] init];
        params.level = [NSNumber numberWithUnsignedChar:160U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:1U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:1U];
        [cluster moveToLevelWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"TH sends a MoveToLevel command to the DUT with Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_33()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 160U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWrites1ToTheOptionsAttribute_34()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:1U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"TH writes 1 to the Options attribute Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionsAttribute_35()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOptionsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Options attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("Options", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOnCommandToDut_36()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends On command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsAMoveToLevelCommandToTheDutWith_37()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterMoveToLevelParams alloc] init];
        params.level = [NSNumber numberWithUnsignedChar:100U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToLevelWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"TH sends a MoveToLevel command to the DUT with Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_38()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 100U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOffCommandToDut_39()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends Off command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsAMoveToLevelCommandToTheDutWith_40()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterMoveToLevelParams alloc] init];
        params.level = [NSNumber numberWithUnsignedChar:120U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToLevelWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"TH sends a MoveToLevel command to the DUT with Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_41()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 120U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsAMoveToLevelCommandToTheDutWith_42()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterMoveToLevelParams alloc] init];
        params.level = [NSNumber numberWithUnsignedChar:140U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:1U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveToLevelWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"TH sends a MoveToLevel command to the DUT with Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_43()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 120U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsAMoveToLevelCommandToTheDutWith_44()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterMoveToLevelParams alloc] init];
        params.level = [NSNumber numberWithUnsignedChar:160U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:1U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:1U];
        [cluster moveToLevelWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"TH sends a MoveToLevel command to the DUT with Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_45()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 160U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_LVL_4_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_LVL_4_1()
        : TestCommandBridge("Test_TC_LVL_4_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_LVL_4_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_LVL_4_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_LVL_4_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Precondition Send On Command\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestPreconditionSendOnCommand_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Check on/off attribute value is true after on command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsTrueAfterOnCommand_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Precondition: write default value of OnOffTransitionTime attribute\n");
            if (ShouldSkip("LVL.S.A0010")) {
                NextTest();
                return;
            }
            err = TestPreconditionWriteDefaultValueOfOnOffTransitionTimeAttribute_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH writes 0 to the Options attribute\n");
            if (ShouldSkip("LVL.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThWrites0ToTheOptionsAttribute_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH reads the MaxLevel attribute from the DUT\n");
            if (ShouldSkip("LVL.S.A0003")) {
                NextTest();
                return;
            }
            err = TestThReadsTheMaxLevelAttributeFromTheDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : TH sends Off command to DUT\n");
            if (ShouldSkip("OO.S.C00.Rsp && LVL.S.C05.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOffCommandToDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool,
                " ***** Test Step 7 : TH sends a MoveWithOnOff command to DUT, with MoveMode =0x00 (up) and Rate =10 (units/s)\n");
            if (ShouldSkip("LVL.S.C05.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveWithOnOffCommandToDutWithMoveMode0x00UpAndRate10UnitsS_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : TH reads OnOff attribute (On/Off cluster) from DUT\n");
            if (ShouldSkip("OO.S.A0000 && LVL.S.C05.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsOnOffAttributeOnOffClusterFromDut_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C05.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Wait 5000ms\n");
            err = TestWait5000ms_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C05.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : TH sends On command to DUT\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool,
                " ***** Test Step 13 : TH sends a MoveToLevel command to DUT, with Level =50 and TransitionTime =0 (immediate)\n");
            if (ShouldSkip("LVL.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveToLevelCommandToDutWithLevel50AndTransitionTime0Immediate_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool,
                " ***** Test Step 15 : TH sends a Move command to the DUT with MoveMode =0x00 (up) and Rate =5 (units/s)\n");
            if (ShouldSkip("LVL.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveCommandToTheDutWithMoveMode0x00UpAndRate5UnitsS_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Wait 10s\n");
            err = TestWait10s_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C01.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Wait 10s\n");
            err = TestWait10s_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C01.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Wait 10s\n");
            err = TestWait10s_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C01.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : Wait 19s\n");
            err = TestWait19s_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C01.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : Precondition send Off Command\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestPreconditionSendOffCommand_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : Check on/off attribute value is false after off command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsFalseAfterOffCommand_25();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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));
            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));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 26;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestPreconditionSendOnCommand_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Precondition Send On Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsTrueAfterOnCommand_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is true after on command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 1));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestPreconditionWriteDefaultValueOfOnOffTransitionTimeAttribute_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id onOffTransitionTimeArgument;
        onOffTransitionTimeArgument = [NSNumber numberWithUnsignedShort:0U];
        [cluster
            writeAttributeOnOffTransitionTimeWithValue:onOffTransitionTimeArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(
                                                    @"Precondition: write default value of OnOffTransitionTime attribute Error: %@",
                                                    err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWrites0ToTheOptionsAttribute_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"TH writes 0 to the Options attribute Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheMaxLevelAttributeFromTheDut_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the MaxLevel attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("maxLevel", "int8u", "int8u"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("maxLevel", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("maxLevel", [value unsignedCharValue], 254U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOffCommandToDut_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends Off command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsAMoveWithOnOffCommandToDutWithMoveMode0x00UpAndRate10UnitsS_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterMoveWithOnOffParams alloc] init];
        params.moveMode = [NSNumber numberWithUnsignedChar:0U];
        params.rate = [NSNumber numberWithUnsignedChar:10U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveWithOnOffWithParams:params
                              completion:^(NSError * _Nullable err) {
                                  NSLog(@"TH sends a MoveWithOnOff command to DUT, with MoveMode =0x00 (up) and Rate =10 (units/s) "
                                        @"Error: %@",
                                      err);

                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOnOffAttributeOnOffClusterFromDut_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads OnOff attribute (On/Off cluster) from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 1));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nullable CurrentLevelValue;

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("currentLevel", "int8u", "int8u"));
            }
            {
                CurrentLevelValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait5000ms_10()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 5000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentLevel", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentLevel", [value unsignedCharValue], 254U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOnCommandToDut_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends On command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsAMoveToLevelCommandToDutWithLevel50AndTransitionTime0Immediate_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterMoveToLevelParams alloc] init];
        params.level = [NSNumber numberWithUnsignedChar:50U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster
            moveToLevelWithParams:params
                       completion:^(NSError * _Nullable err) {
                           NSLog(
                               @"TH sends a MoveToLevel command to DUT, with Level =50 and TransitionTime =0 (immediate) Error: %@",
                               err);

                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                           NextTest();
                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 50U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsAMoveCommandToTheDutWithMoveMode0x00UpAndRate5UnitsS_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterMoveParams alloc] init];
        params.moveMode = [NSNumber numberWithUnsignedChar:0U];
        params.rate = [NSNumber numberWithUnsignedChar:5U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveWithParams:params
                     completion:^(NSError * _Nullable err) {
                         NSLog(@"TH sends a Move command to the DUT with MoveMode =0x00 (up) and Rate =5 (units/s) Error: %@", err);

                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                         NextTest();
                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_16()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentLevel", [value unsignedCharValue], 85U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentLevel", [value unsignedCharValue], 115U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_18()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_19()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentLevel", [value unsignedCharValue], 127U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentLevel", [value unsignedCharValue], 173U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_20()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_21()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentLevel", [value unsignedCharValue], 170U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentLevel", [value unsignedCharValue], 230U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait19s_22()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 19000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_23()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 254U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestPreconditionSendOffCommand_24()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Precondition send Off Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_25()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is false after off command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_LVL_5_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_LVL_5_1()
        : TestCommandBridge("Test_TC_LVL_5_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_LVL_5_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_LVL_5_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_LVL_5_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Precondition Send On Command\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestPreconditionSendOnCommand_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Check on/off attribute value is true after on command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsTrueAfterOnCommand_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Precondition: write default value of OnOffTransitionTime attribute\n");
            if (ShouldSkip("LVL.S.A0010")) {
                NextTest();
                return;
            }
            err = TestPreconditionWriteDefaultValueOfOnOffTransitionTimeAttribute_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH writes 0 to the Options attribute\n");
            if (ShouldSkip("LVL.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThWrites0ToTheOptionsAttribute_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH sends Off command to DUT\n");
            if (ShouldSkip("OO.S.C00.Rsp && LVL.S.C06.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOffCommandToDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool,
                " ***** Test Step 6 : TH sends a StepWithOnOff command to DUT, with StepMode =0x00 (up), StepSize =50 and "
                "TransitionTime =0 (immediate)\n");
            if (ShouldSkip("LVL.S.C06.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAStepWithOnOffCommandToDutWithStepMode0x00UpStepSize50AndTransitionTime0Immediate_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH reads OnOff attribute (On/Off cluster) from DUT\n");
            if (ShouldSkip("OO.S.A0000 && LVL.S.C06.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsOnOffAttributeOnOffClusterFromDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : TH sends On command to DUT\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_8();
            break;
        case 9:
            ChipLogProgress(chipTool,
                " ***** Test Step 9 : TH sends a MoveToLevel command to DUT, with Level =50 and TransitionTime =0 (immediate)\n");
            if (ShouldSkip("LVL.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveToLevelCommandToDutWithLevel50AndTransitionTime0Immediate_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Reads current level attribute from DUT\n");
            if (ShouldSkip("LVL.S.A0000 && LVL.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsCurrentLevelAttributeFromDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool,
                " ***** Test Step 11 : TH sends a Step command to the DUT with StepMode =0x00 (up), StepSize =150 and "
                "TransitionTime =300\n");
            if (ShouldSkip("LVL.S.C02.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAStepCommandToTheDutWithStepMode0x00UpStepSize150AndTransitionTime300_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Wait 10s\n");
            err = TestWait10s_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C02.Rsp && LVL.S.A0000 && LVL.S.M.VarRate")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Wait 10s\n");
            err = TestWait10s_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C02.Rsp && LVL.S.A0000 && LVL.S.M.VarRate")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Wait 10s\n");
            err = TestWait10s_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C02.Rsp && LVL.S.A0000 && LVL.S.M.VarRate")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Wait 5000ms\n");
            err = TestWait5000ms_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C02.Rsp && LVL.S.A0000 && LVL.S.M.VarRate")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_19();
            break;
        case 20:
            ChipLogProgress(chipTool,
                " ***** Test Step 20 : TH reads CurrentLevel attribute from DUT (after DUT has finished the transition)\n");
            if (ShouldSkip("LVL.S.C02.Rsp && LVL.S.A0000 && !LVL.S.M.VarRate")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDutAfterDutHasFinishedTheTransition_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Precondition send Off Command\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestPreconditionSendOffCommand_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : Check on/off attribute value is false after off command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsFalseAfterOffCommand_22();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 23;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestPreconditionSendOnCommand_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Precondition Send On Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsTrueAfterOnCommand_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is true after on command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 1));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestPreconditionWriteDefaultValueOfOnOffTransitionTimeAttribute_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id onOffTransitionTimeArgument;
        onOffTransitionTimeArgument = [NSNumber numberWithUnsignedShort:0U];
        [cluster
            writeAttributeOnOffTransitionTimeWithValue:onOffTransitionTimeArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(
                                                    @"Precondition: write default value of OnOffTransitionTime attribute Error: %@",
                                                    err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWrites0ToTheOptionsAttribute_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"TH writes 0 to the Options attribute Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOffCommandToDut_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends Off command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsAStepWithOnOffCommandToDutWithStepMode0x00UpStepSize50AndTransitionTime0Immediate_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterStepWithOnOffParams alloc] init];
        params.stepMode = [NSNumber numberWithUnsignedChar:0U];
        params.stepSize = [NSNumber numberWithUnsignedChar:50U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster stepWithOnOffWithParams:params
                              completion:^(NSError * _Nullable err) {
                                  NSLog(@"TH sends a StepWithOnOff command to DUT, with StepMode =0x00 (up), StepSize =50 and "
                                        @"TransitionTime =0 (immediate) Error: %@",
                                      err);

                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOnOffAttributeOnOffClusterFromDut_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads OnOff attribute (On/Off cluster) from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 1));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOnCommandToDut_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends On command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsAMoveToLevelCommandToDutWithLevel50AndTransitionTime0Immediate_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterMoveToLevelParams alloc] init];
        params.level = [NSNumber numberWithUnsignedChar:50U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster
            moveToLevelWithParams:params
                       completion:^(NSError * _Nullable err) {
                           NSLog(
                               @"TH sends a MoveToLevel command to DUT, with Level =50 and TransitionTime =0 (immediate) Error: %@",
                               err);

                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                           NextTest();
                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsCurrentLevelAttributeFromDut_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads current level attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 50U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsAStepCommandToTheDutWithStepMode0x00UpStepSize150AndTransitionTime300_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterStepParams alloc] init];
        params.stepMode = [NSNumber numberWithUnsignedChar:0U];
        params.stepSize = [NSNumber numberWithUnsignedChar:150U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:300U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster stepWithParams:params
                     completion:^(NSError * _Nullable err) {
                         NSLog(@"TH sends a Step command to the DUT with StepMode =0x00 (up), StepSize =150 and TransitionTime "
                               @"=300 Error: %@",
                             err);

                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                         NextTest();
                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_12()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentLevel", [value unsignedCharValue], 85U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentLevel", [value unsignedCharValue], 115U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_14()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentLevel", [value unsignedCharValue], 127U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentLevel", [value unsignedCharValue], 173U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_16()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentLevel", [value unsignedCharValue], 170U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentLevel", [value unsignedCharValue], 200U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait5000ms_18()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 5000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_19()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 200U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDutAfterDutHasFinishedTheTransition_20()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT (after DUT has finished the transition) Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 200U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestPreconditionSendOffCommand_21()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Precondition send Off Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_22()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is false after off command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_LVL_6_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_LVL_6_1()
        : TestCommandBridge("Test_TC_LVL_6_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_LVL_6_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_LVL_6_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_LVL_6_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Precondition: write default value of OnOffTransitionTime attribute\n");
            if (ShouldSkip("LVL.S.A0010")) {
                NextTest();
                return;
            }
            err = TestPreconditionWriteDefaultValueOfOnOffTransitionTimeAttribute_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH writes 0 to the Options attribute\n");
            if (ShouldSkip("LVL.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThWrites0ToTheOptionsAttribute_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : TH sends On command to DUT\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool,
                " ***** Test Step 4 : TH sends a MoveToLevel command to DUT, with Level =50 and TransitionTime =0 (immediate)\n");
            if (ShouldSkip("LVL.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveToLevelCommandToDutWithLevel50AndTransitionTime0Immediate_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.A0000 && LVL.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool,
                " ***** Test Step 6 : TH sends a Move command to the DUT, with the MoveMode field set to 0x00 (move up) and the "
                "Rate field set to 0x05 (5 units/s)\n");
            if (ShouldSkip("LVL.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveCommandToTheDutWithTheMoveModeFieldSetTo0x00MoveUpAndTheRateFieldSetTo0x055UnitsS_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Wait 5000ms\n");
            err = TestWait5000ms_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Sends stop command to DUT\n");
            if (ShouldSkip("LVL.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsStopCommandToDut_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Physically verify that the device has stopped transitioning\n");
            if (ShouldSkip("PICS_USER_PROMPT && LVL.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestPhysicallyVerifyThatTheDeviceHasStoppedTransitioning_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C01.Rsp && LVL.S.C03.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool,
                " ***** Test Step 11 : TH sends a Move command to the DUT, with the MoveMode field set to 0x00 (move up) and the "
                "Rate field set to 0x05 (5 units/s)\n");
            if (ShouldSkip("LVL.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveCommandToTheDutWithTheMoveModeFieldSetTo0x00MoveUpAndTheRateFieldSetTo0x055UnitsS_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Wait 5000ms\n");
            err = TestWait5000ms_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : TH sends a StopWithOnOff command to the DUT\n");
            if (ShouldSkip("LVL.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAStopWithOnOffCommandToTheDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Physically verify that the device has stopped transitioning\n");
            if (ShouldSkip("PICS_USER_PROMPT && LVL.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestPhysicallyVerifyThatTheDeviceHasStoppedTransitioning_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C01.Rsp && LVL.S.C07.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadsCurrentLevelAttributeFromDut_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Precondition send Off Command\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestPreconditionSendOffCommand_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Check on/off attribute value is false after off command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsFalseAfterOffCommand_17();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 18;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestPreconditionWriteDefaultValueOfOnOffTransitionTimeAttribute_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id onOffTransitionTimeArgument;
        onOffTransitionTimeArgument = [NSNumber numberWithUnsignedShort:0U];
        [cluster
            writeAttributeOnOffTransitionTimeWithValue:onOffTransitionTimeArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(
                                                    @"Precondition: write default value of OnOffTransitionTime attribute Error: %@",
                                                    err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWrites0ToTheOptionsAttribute_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"TH writes 0 to the Options attribute Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOnCommandToDut_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends On command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsAMoveToLevelCommandToDutWithLevel50AndTransitionTime0Immediate_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterMoveToLevelParams alloc] init];
        params.level = [NSNumber numberWithUnsignedChar:50U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster
            moveToLevelWithParams:params
                       completion:^(NSError * _Nullable err) {
                           NSLog(
                               @"TH sends a MoveToLevel command to DUT, with Level =50 and TransitionTime =0 (immediate) Error: %@",
                               err);

                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                           NextTest();
                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 50U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsAMoveCommandToTheDutWithTheMoveModeFieldSetTo0x00MoveUpAndTheRateFieldSetTo0x055UnitsS_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterMoveParams alloc] init];
        params.moveMode = [NSNumber numberWithUnsignedChar:0U];
        params.rate = [NSNumber numberWithUnsignedChar:5U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveWithParams:params
                     completion:^(NSError * _Nullable err) {
                         NSLog(@"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) Error: %@",
                             err);

                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                         NextTest();
                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait5000ms_7()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 5000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestSendsStopCommandToDut_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterStopParams alloc] init];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster stopWithParams:params
                     completion:^(NSError * _Nullable err) {
                         NSLog(@"Sends stop command to DUT Error: %@", err);

                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                         NextTest();
                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestPhysicallyVerifyThatTheDeviceHasStoppedTransitioning_9()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentLevel", [value unsignedCharValue], 64U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentLevel", [value unsignedCharValue], 86U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsAMoveCommandToTheDutWithTheMoveModeFieldSetTo0x00MoveUpAndTheRateFieldSetTo0x055UnitsS_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterMoveParams alloc] init];
        params.moveMode = [NSNumber numberWithUnsignedChar:0U];
        params.rate = [NSNumber numberWithUnsignedChar:5U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster moveWithParams:params
                     completion:^(NSError * _Nullable err) {
                         NSLog(@"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) Error: %@",
                             err);

                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                         NextTest();
                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait5000ms_12()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 5000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThSendsAStopWithOnOffCommandToTheDut_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterStopWithOnOffParams alloc] init];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster stopWithOnOffWithParams:params
                              completion:^(NSError * _Nullable err) {
                                  NSLog(@"TH sends a StopWithOnOff command to the DUT Error: %@", err);

                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestPhysicallyVerifyThatTheDeviceHasStoppedTransitioning_14()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestReadsCurrentLevelAttributeFromDut_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentLevel", [value unsignedCharValue], 85U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentLevel", [value unsignedCharValue], 115U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestPreconditionSendOffCommand_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Precondition send Off Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is false after off command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_LCFG_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_LCFG_1_1()
        : TestCommandBridge("Test_TC_LCFG_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_LCFG_1_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_LCFG_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_LCFG_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads the ClusterRevision from DUT\n");
            err = TestThReadsTheClusterRevisionFromDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads the FeatureMap from DUT\n");
            err = TestThReadsTheFeatureMapFromDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : TH reads AttributeList from DUT\n");
            err = TestThReadsAttributeListFromDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH reads AcceptedCommandList from DUT\n");
            err = TestThReadsAcceptedCommandListFromDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH reads GeneratedCommandList from DUT\n");
            err = TestThReadsGeneratedCommandListFromDut_5();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 6;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheClusterRevisionFromDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device
                                                                                     endpointID:@(0)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the ClusterRevision from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheFeatureMapFromDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device
                                                                                     endpointID:@(0)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the FeatureMap from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAttributeListFromDut_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device
                                                                                     endpointID:@(0)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AttributeList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAcceptedCommandListFromDut_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device
                                                                                     endpointID:@(0)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AcceptedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsGeneratedCommandListFromDut_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device
                                                                                     endpointID:@(0)
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads GeneratedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_LUNIT_1_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_LUNIT_1_2()
        : TestCommandBridge("Test_TC_LUNIT_1_2")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_LUNIT_1_2() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_LUNIT_1_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_LUNIT_1_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads the ClusterRevision from DUT\n");
            if (ShouldSkip("LUNIT.S.Afffd")) {
                NextTest();
                return;
            }
            err = TestThReadsTheClusterRevisionFromDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads the FeatureMap from DUT\n");
            if (ShouldSkip("LUNIT.S.Afffc && !LUNIT.S.F00")) {
                NextTest();
                return;
            }
            err = TestThReadsTheFeatureMapFromDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Given LUNIT.S.F00(TEMP) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("LUNIT.S.Afffc && LUNIT.S.F00")) {
                NextTest();
                return;
            }
            err = TestGivenLunitsf00tempEnsureFeaturemapHasTheCorrectBitSet_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH reads AttributeList from DUT\n");
            if (ShouldSkip("LUNIT.S.Afffb")) {
                NextTest();
                return;
            }
            err = TestThReadsAttributeListFromDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH reads Feature dependent(LUNIT.S.F00) attribute in AttributeList\n");
            if (ShouldSkip("LUNIT.S.Afffb && LUNIT.S.F00")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentLUNITSF00AttributeInAttributeList_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : TH reads AcceptedCommandList from DUT\n");
            if (ShouldSkip("LUNIT.S.Afff9")) {
                NextTest();
                return;
            }
            err = TestThReadsAcceptedCommandListFromDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH reads GeneratedCommandList from DUT\n");
            if (ShouldSkip("LUNIT.S.Afff8")) {
                NextTest();
                return;
            }
            err = TestThReadsGeneratedCommandListFromDut_7();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 8;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheClusterRevisionFromDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the ClusterRevision from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheFeatureMapFromDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the FeatureMap from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenLunitsf00tempEnsureFeaturemapHasTheCorrectBitSet_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given LUNIT.S.F00(TEMP) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAttributeListFromDut_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AttributeList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentLUNITSF00AttributeInAttributeList_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent(LUNIT.S.F00) attribute in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAcceptedCommandListFromDut_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AcceptedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsGeneratedCommandListFromDut_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads GeneratedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_LUNIT_3_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_LUNIT_3_1()
        : TestCommandBridge("Test_TC_LUNIT_3_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_LUNIT_3_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_LUNIT_3_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_LUNIT_3_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads TemperatureUnit attribute from DUT\n");
            if (ShouldSkip("LUNIT.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsTemperatureUnitAttributeFromDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH writes 0 (Fahrenheit) to TemperatureUnit attribute\n");
            if (ShouldSkip("LUNIT.S.A0000 && LUNIT.TempUnit.Fahrenheit")) {
                NextTest();
                return;
            }
            err = TestThWrites0FahrenheitToTemperatureUnitAttribute_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : TH reads TemperatureUnit attribute\n");
            if (ShouldSkip("LUNIT.S.A0000 && LUNIT.TempUnit.Fahrenheit")) {
                NextTest();
                return;
            }
            err = TestThReadsTemperatureUnitAttribute_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH writes 1 (Celsius) to TemperatureUnit attribute\n");
            if (ShouldSkip("LUNIT.S.A0000 && LUNIT.TempUnit.Celsius")) {
                NextTest();
                return;
            }
            err = TestThWrites1CelsiusToTemperatureUnitAttribute_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH reads TemperatureUnit attribute\n");
            if (ShouldSkip("LUNIT.S.A0000 && LUNIT.TempUnit.Celsius")) {
                NextTest();
                return;
            }
            err = TestThReadsTemperatureUnitAttribute_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : TH writes 2 (Kelvin) to TemperatureUnit attribute\n");
            if (ShouldSkip("LUNIT.S.A0000 && LUNIT.TempUnit.Kelvin")) {
                NextTest();
                return;
            }
            err = TestThWrites2KelvinToTemperatureUnitAttribute_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH reads TemperatureUnit attribute\n");
            if (ShouldSkip("LUNIT.S.A0000 && LUNIT.TempUnit.Kelvin")) {
                NextTest();
                return;
            }
            err = TestThReadsTemperatureUnitAttribute_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : TH writes 5 to TemperatureUnit attribute\n");
            if (ShouldSkip("LUNIT.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThWrites5ToTemperatureUnitAttribute_8();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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_CONSTRAINT_ERROR));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 9;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTemperatureUnitAttributeFromDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTemperatureUnitWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads TemperatureUnit attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("temperatureUnit", "enum8", "enum8"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWrites0FahrenheitToTemperatureUnitAttribute_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id temperatureUnitArgument;
        temperatureUnitArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeTemperatureUnitWithValue:temperatureUnitArgument
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"TH writes 0 (Fahrenheit) to TemperatureUnit attribute Error: %@", err);

                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTemperatureUnitAttribute_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTemperatureUnitWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads TemperatureUnit attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("TemperatureUnit", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWrites1CelsiusToTemperatureUnitAttribute_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id temperatureUnitArgument;
        temperatureUnitArgument = [NSNumber numberWithUnsignedChar:1U];
        [cluster writeAttributeTemperatureUnitWithValue:temperatureUnitArgument
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"TH writes 1 (Celsius) to TemperatureUnit attribute Error: %@", err);

                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTemperatureUnitAttribute_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTemperatureUnitWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads TemperatureUnit attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("TemperatureUnit", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWrites2KelvinToTemperatureUnitAttribute_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id temperatureUnitArgument;
        temperatureUnitArgument = [NSNumber numberWithUnsignedChar:2U];
        [cluster writeAttributeTemperatureUnitWithValue:temperatureUnitArgument
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"TH writes 2 (Kelvin) to TemperatureUnit attribute Error: %@", err);

                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTemperatureUnitAttribute_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTemperatureUnitWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads TemperatureUnit attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("TemperatureUnit", actualValue, 2U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWrites5ToTemperatureUnitAttribute_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id temperatureUnitArgument;
        temperatureUnitArgument = [NSNumber numberWithUnsignedChar:5U];
        [cluster writeAttributeTemperatureUnitWithValue:temperatureUnitArgument
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"TH writes 5 to TemperatureUnit attribute Error: %@", err);

                                                 VerifyOrReturn(CheckValue("status",
                                                     err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                             ? err.code
                                                             : EMBER_ZCL_STATUS_FAILURE)
                                                         : 0,
                                                     EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_LTIME_1_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_LTIME_1_2()
        : TestCommandBridge("Test_TC_LTIME_1_2")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_LTIME_1_2() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_LTIME_1_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_LTIME_1_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads the ClusterRevision from DUT\n");
            if (ShouldSkip("LTIME.S.Afffd")) {
                NextTest();
                return;
            }
            err = TestThReadsTheClusterRevisionFromDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads the FeatureMap from DUT\n");
            if (ShouldSkip("LTIME.S.Afffc")) {
                NextTest();
                return;
            }
            err = TestThReadsTheFeatureMapFromDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : TH reads AttributeList from DUT\n");
            if (ShouldSkip("LTIME.S.Afffb")) {
                NextTest();
                return;
            }
            err = TestThReadsAttributeListFromDut_3();
            break;
        case 4:
            ChipLogProgress(
                chipTool, " ***** Test Step 4 : TH reads optional attribute(ActiveCalendarType) in AttributeList from DUT\n");
            if (ShouldSkip("LTIME.S.Afffb && LTIME.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeActiveCalendarTypeInAttributeListFromDut_4();
            break;
        case 5:
            ChipLogProgress(
                chipTool, " ***** Test Step 5 : TH reads optional attribute(SupportedCalendarTypes) in AttributeList from DUT\n");
            if (ShouldSkip("LTIME.S.Afffb && LTIME.S.A0002")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeSupportedCalendarTypesInAttributeListFromDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : TH reads AcceptedCommandList from DUT\n");
            if (ShouldSkip("LTIME.S.Afff9")) {
                NextTest();
                return;
            }
            err = TestThReadsAcceptedCommandListFromDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH reads GeneratedCommandList from DUT\n");
            if (ShouldSkip("LTIME.S.Afff8")) {
                NextTest();
                return;
            }
            err = TestThReadsGeneratedCommandListFromDut_7();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 8;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheClusterRevisionFromDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the ClusterRevision from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheFeatureMapFromDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the FeatureMap from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            VerifyOrReturn(CheckConstraintMinValue<uint32_t>("featureMap", [value unsignedIntValue], 0UL));
            VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("featureMap", [value unsignedIntValue], 1UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAttributeListFromDut_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AttributeList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeActiveCalendarTypeInAttributeListFromDut_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(ActiveCalendarType) in AttributeList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeSupportedCalendarTypesInAttributeListFromDut_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(SupportedCalendarTypes) in AttributeList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAcceptedCommandListFromDut_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AcceptedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsGeneratedCommandListFromDut_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads GeneratedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_LOWPOWER_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_LOWPOWER_1_1()
        : TestCommandBridge("Test_TC_LOWPOWER_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_LOWPOWER_1_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_LOWPOWER_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_LOWPOWER_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_5();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 6;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AttributeList", [actualValue count], static_cast<uint32_t>(5)));
                VerifyOrReturn(CheckValue("", actualValue[0], 65528UL));
                VerifyOrReturn(CheckValue("", actualValue[1], 65529UL));
                VerifyOrReturn(CheckValue("", actualValue[2], 65531UL));
                VerifyOrReturn(CheckValue("", actualValue[3], 65532UL));
                VerifyOrReturn(CheckValue("", actualValue[4], 65533UL));
            }

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(1)));
                VerifyOrReturn(CheckValue("", actualValue[0], 0UL));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_KEYPADINPUT_1_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_KEYPADINPUT_1_2()
        : TestCommandBridge("Test_TC_KEYPADINPUT_1_2")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_KEYPADINPUT_1_2() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_KEYPADINPUT_1_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_KEYPADINPUT_1_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            if (ShouldSkip(" !KEYPADINPUT.S.NV && KEYPADINPUT.S.LK && !KEYPADINPUT.S.NK ")) {
                NextTest();
                return;
            }
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Given (KEYPADINPUT.S.NV) FeatureMap bit mask is set or not\n");
            if (ShouldSkip("KEYPADINPUT.S.NV")) {
                NextTest();
                return;
            }
            err = TestGivenKeypadinputsnvFeatureMapBitMaskIsSetOrNot_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Given (KEYPADINPUT.S.LK) FeatureMap bit mask is set or not\n");
            if (ShouldSkip("KEYPADINPUT.S.LK")) {
                NextTest();
                return;
            }
            err = TestGivenKeypadinputslkFeatureMapBitMaskIsSetOrNot_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Given (KEYPADINPUT.S.NK) FeatureMap bit mask is set or not\n");
            if (ShouldSkip("KEYPADINPUT.S.NK")) {
                NextTest();
                return;
            }
            err = TestGivenKeypadinputsnkFeatureMapBitMaskIsSetOrNot_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_8();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 9;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenKeypadinputsnvFeatureMapBitMaskIsSetOrNot_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given (KEYPADINPUT.S.NV) FeatureMap bit mask is set or not Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenKeypadinputslkFeatureMapBitMaskIsSetOrNot_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given (KEYPADINPUT.S.LK) FeatureMap bit mask is set or not Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenKeypadinputsnkFeatureMapBitMaskIsSetOrNot_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given (KEYPADINPUT.S.NK) FeatureMap bit mask is set or not Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 1UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_APPLAUNCHER_1_3 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_APPLAUNCHER_1_3()
        : TestCommandBridge("Test_TC_APPLAUNCHER_1_3")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_APPLAUNCHER_1_3() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_APPLAUNCHER_1_3\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_APPLAUNCHER_1_3\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            if (ShouldSkip("APPLAUNCHER.S.AP")) {
                NextTest();
                return;
            }
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the global attribute: FeatureMap\n");
            if (ShouldSkip(" !APPLAUNCHER.S.AP ")) {
                NextTest();
                return;
            }
            err = TestReadTheGlobalAttributeFeatureMap_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the optional attribute(CatalogList) in AttributeList\n");
            if (ShouldSkip("APPLAUNCHER.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeCatalogListInAttributeList_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read the optional attribute(CurrentApp) in AttributeList\n");
            if (ShouldSkip("APPLAUNCHER.S.A0001")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeCurrentAppInAttributeList_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_8();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 9;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 1UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeCatalogListInAttributeList_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(CatalogList) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeCurrentAppInAttributeList_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(CurrentApp) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 2UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAINPUT_1_4 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_MEDIAINPUT_1_4()
        : TestCommandBridge("Test_TC_MEDIAINPUT_1_4")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_MEDIAINPUT_1_4() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_MEDIAINPUT_1_4\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_MEDIAINPUT_1_4\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            if (ShouldSkip(" !MEDIAINPUT.S.NU ")) {
                NextTest();
                return;
            }
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Given MEDIAINPUT.S.NU ensure featuremap has the correct bit set\n");
            if (ShouldSkip("MEDIAINPUT.S.NU")) {
                NextTest();
                return;
            }
            err = TestGivenMediainputsnuEnsureFeaturemapHasTheCorrectBitSet_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the optional attribute(InputList) in AttributeList\n");
            if (ShouldSkip("MEDIAINPUT.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeInputListInAttributeList_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read the optional attribute(CurrentInput) in AttributeList\n");
            if (ShouldSkip("MEDIAINPUT.S.A0001")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeCurrentInputInAttributeList_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_8();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 9;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenMediainputsnuEnsureFeaturemapHasTheCorrectBitSet_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given MEDIAINPUT.S.NU ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeInputListInAttributeList_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(InputList) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeCurrentInputInAttributeList_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(CurrentInput) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_WAKEONLAN_1_5 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_WAKEONLAN_1_5()
        : TestCommandBridge("Test_TC_WAKEONLAN_1_5")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_WAKEONLAN_1_5() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_WAKEONLAN_1_5\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_WAKEONLAN_1_5\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the optional attribute(MACAddress) in AttributeList\n");
            if (ShouldSkip("WAKEONLAN.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeMACAddressInAttributeList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_6();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 7;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWakeOnLAN alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWakeOnLAN alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWakeOnLAN alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeMACAddressInAttributeList_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWakeOnLAN alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(MACAddress) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWakeOnLAN alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWakeOnLAN alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_CHANNEL_1_6 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_CHANNEL_1_6()
        : TestCommandBridge("Test_TC_CHANNEL_1_6")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_CHANNEL_1_6() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_CHANNEL_1_6\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_CHANNEL_1_6\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            if (ShouldSkip("( !CHANNEL.S.CL && !CHANNEL.S.LI )")) {
                NextTest();
                return;
            }
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Given CHANNEL.S.CL ensure featuremap has the correct bit set\n");
            if (ShouldSkip("CHANNEL.S.CL")) {
                NextTest();
                return;
            }
            err = TestGivenChannelsclEnsureFeaturemapHasTheCorrectBitSet_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Given CHANNEL.S.LI ensure featuremap has the correct bit set\n");
            if (ShouldSkip("CHANNEL.S.LI")) {
                NextTest();
                return;
            }
            err = TestGivenChannelsliEnsureFeaturemapHasTheCorrectBitSet_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read the optional attribute(ChannelList): AttributeList\n");
            if (ShouldSkip("CHANNEL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeChannelListAttributeList_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Reading optional attribute(Lineup) in AttributeList\n");
            if (ShouldSkip("CHANNEL.S.A0001")) {
                NextTest();
                return;
            }
            err = TestReadingOptionalAttributeLineupInAttributeList_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read the optional attribute(CurrentChannel): AttributeList\n");
            if (ShouldSkip("CHANNEL.S.A0002")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeCurrentChannelAttributeList_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Read the optional command(ChangeChannel) in AcceptedCommandList\n");
            if (ShouldSkip("CHANNEL.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandChangeChannelInAcceptedCommandList_9();
            break;
        case 10:
            ChipLogProgress(
                chipTool, " ***** Test Step 10 : Read the optional command(ChangeChannelByNumber) in AcceptedCommandList\n");
            if (ShouldSkip("CHANNEL.S.C02.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandChangeChannelByNumberInAcceptedCommandList_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Read the optional command(SkipChannel) in AcceptedCommandList\n");
            if (ShouldSkip("CHANNEL.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandSkipChannelInAcceptedCommandList_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Read the global attribute: GeneratedCommandList\n");
            if (ShouldSkip("( !CHANNEL.S.CL && !CHANNEL.S.LI )")) {
                NextTest();
                return;
            }
            err = TestReadTheGlobalAttributeGeneratedCommandList_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Read the global attribute: GeneratedCommandList\n");
            if (ShouldSkip("CHANNEL.S.CL || CHANNEL.S.LI")) {
                NextTest();
                return;
            }
            err = TestReadTheGlobalAttributeGeneratedCommandList_13();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 14;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenChannelsclEnsureFeaturemapHasTheCorrectBitSet_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given CHANNEL.S.CL ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenChannelsliEnsureFeaturemapHasTheCorrectBitSet_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given CHANNEL.S.LI ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeChannelListAttributeList_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(ChannelList): AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadingOptionalAttributeLineupInAttributeList_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reading optional attribute(Lineup) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeCurrentChannelAttributeList_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(CurrentChannel): AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalCommandChangeChannelInAcceptedCommandList_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional command(ChangeChannel) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalCommandChangeChannelByNumberInAcceptedCommandList_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional command(ChangeChannelByNumber) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 2UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalCommandSkipChannelInAcceptedCommandList_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional command(SkipChannel) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 1UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAPLAYBACK_1_7 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_MEDIAPLAYBACK_1_7()
        : TestCommandBridge("Test_TC_MEDIAPLAYBACK_1_7")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_MEDIAPLAYBACK_1_7() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_MEDIAPLAYBACK_1_7\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_MEDIAPLAYBACK_1_7\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            if (ShouldSkip(" !MEDIAPLAYBACK.S.AS && !MEDIAPLAYBACK.S.VS ")) {
                NextTest();
                return;
            }
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Given MEDIAPLAYBACK.S.AS ensure featuremap has the correct bit set\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.AS")) {
                NextTest();
                return;
            }
            err = TestGivenMediaplaybacksasEnsureFeaturemapHasTheCorrectBitSet_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Given MEDIAPLAYBACK.S.VS ensure featuremap has the correct bit set\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.VS")) {
                NextTest();
                return;
            }
            err = TestGivenMediaplaybacksvsEnsureFeaturemapHasTheCorrectBitSet_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read the optional attribute(StartTime) in AttributeList\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0001")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeStartTimeInAttributeList_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read the optional attribute(Duration) in AttributeList\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0002")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeDurationInAttributeList_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read the optional attribute(SampledPosition) in AttributeList\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0003")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeSampledPositionInAttributeList_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Read the optional attribute(PlaybackSpeed) in AttributeList\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0004")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributePlaybackSpeedInAttributeList_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Read the optional attribute(SeekRangeEnd) in AttributeList\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0005")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeSeekRangeEndInAttributeList_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Read the optional attribute(SeekRangeStart) in AttributeList\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0006")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeSeekRangeStartInAttributeList_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Read the optional command(StartOver) in AcceptedCommandList\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandStartOverInAcceptedCommandList_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Read the optional command(Previous) in AcceptedCommandList\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C04.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandPreviousInAcceptedCommandList_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Read the optional command(Next) in AcceptedCommandList\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C05.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandNextInAcceptedCommandList_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Read the optional command(Rewind) in AcceptedCommandList\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C06.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandRewindInAcceptedCommandList_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Read the optional command(FastForward) in AcceptedCommandList\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandFastForwardInAcceptedCommandList_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Read the optional command(SkipForward) in AcceptedCommandList\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandSkipForwardInAcceptedCommandList_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Read the optional command(SkipBackward) in AcceptedCommandList\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C09.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandSkipBackwardInAcceptedCommandList_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Read the optional command(Seek) in AcceptedCommandList\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C0B.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandSeekInAcceptedCommandList_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_21();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 22;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenMediaplaybacksasEnsureFeaturemapHasTheCorrectBitSet_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given MEDIAPLAYBACK.S.AS ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenMediaplaybacksvsEnsureFeaturemapHasTheCorrectBitSet_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given MEDIAPLAYBACK.S.VS ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeStartTimeInAttributeList_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(StartTime) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeDurationInAttributeList_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(Duration) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeSampledPositionInAttributeList_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(SampledPosition) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributePlaybackSpeedInAttributeList_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(PlaybackSpeed) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 4UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeSeekRangeEndInAttributeList_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(SeekRangeEnd) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 5UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeSeekRangeStartInAttributeList_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(SeekRangeStart) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 6UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 2UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalCommandStartOverInAcceptedCommandList_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional command(StartOver) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalCommandPreviousInAcceptedCommandList_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional command(Previous) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 4UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalCommandNextInAcceptedCommandList_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional command(Next) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 5UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalCommandRewindInAcceptedCommandList_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional command(Rewind) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 6UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalCommandFastForwardInAcceptedCommandList_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional command(FastForward) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 7UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalCommandSkipForwardInAcceptedCommandList_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional command(SkipForward) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 8UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalCommandSkipBackwardInAcceptedCommandList_19()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional command(SkipBackward) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 9UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalCommandSeekInAcceptedCommandList_20()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional command(Seek) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 11UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_21()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 10UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_AUDIOOUTPUT_1_8 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_AUDIOOUTPUT_1_8()
        : TestCommandBridge("Test_TC_AUDIOOUTPUT_1_8")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_AUDIOOUTPUT_1_8() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_AUDIOOUTPUT_1_8\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_AUDIOOUTPUT_1_8\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_5();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 6;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            VerifyOrReturn(CheckConstraintMinValue<uint32_t>("featureMap", [value unsignedIntValue], 0UL));
            VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("featureMap", [value unsignedIntValue], 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_TGTNAV_1_9 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_TGTNAV_1_9()
        : TestCommandBridge("Test_TC_TGTNAV_1_9")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_TGTNAV_1_9() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_TGTNAV_1_9\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_TGTNAV_1_9\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the optional attribute(CurrentTarget) in AttributeList\n");
            if (ShouldSkip("TGTNAV.S.A0001")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeCurrentTargetInAttributeList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_6();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 7;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeCurrentTargetInAttributeList_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(CurrentTarget) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 1UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_TGTNAV_8_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_TGTNAV_8_2()
        : TestCommandBridge("Test_TC_TGTNAV_8_2")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_TGTNAV_8_2() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_TGTNAV_8_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_TGTNAV_8_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 0;

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

class Test_TC_APBSC_1_10 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_APBSC_1_10()
        : TestCommandBridge("Test_TC_APBSC_1_10")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_APBSC_1_10() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_APBSC_1_10\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_APBSC_1_10\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read FeatureMap attribute from the DUT\n");
            err = TestReadFeatureMapAttributeFromTheDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the optional attribute(VendorName) in AttributeList\n");
            if (ShouldSkip("APBSC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeVendorNameInAttributeList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the optional attribute(VendorID) in AttributeList\n");
            if (ShouldSkip("APBSC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeVendorIDInAttributeList_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read the optional attribute(ProductID) in AttributeList\n");
            if (ShouldSkip("APBSC.S.A0003")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeProductIDInAttributeList_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_8();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 9;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadFeatureMapAttributeFromTheDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read FeatureMap attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 4UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 5UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 6UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 7UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeVendorNameInAttributeList_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(VendorName) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeVendorIDInAttributeList_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(VendorID) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeProductIDInAttributeList_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(ProductID) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_CONTENTLAUNCHER_1_11 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_CONTENTLAUNCHER_1_11()
        : TestCommandBridge("Test_TC_CONTENTLAUNCHER_1_11")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_CONTENTLAUNCHER_1_11() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_CONTENTLAUNCHER_1_11\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_CONTENTLAUNCHER_1_11\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            if (ShouldSkip("( !CONTENTLAUNCHER.S.CS && !CONTENTLAUNCHER.S.UP )")) {
                NextTest();
                return;
            }
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(
                chipTool, " ***** Test Step 3 : Given CONTENTLAUNCHER.S.CS) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("CONTENTLAUNCHER.S.CS")) {
                NextTest();
                return;
            }
            err = TestGivenContentlauncherscsEnsureFeaturemapHasTheCorrectBitSet_3();
            break;
        case 4:
            ChipLogProgress(
                chipTool, " ***** Test Step 4 : Given CONTENTLAUNCHER.S.UP ensure featuremap has the correct bit set\n");
            if (ShouldSkip("CONTENTLAUNCHER.S.UP")) {
                NextTest();
                return;
            }
            err = TestGivenContentlaunchersupEnsureFeaturemapHasTheCorrectBitSet_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read the optional attribute(AcceptHeader): AttributeList\n");
            if (ShouldSkip("CONTENTLAUNCHER.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeAcceptHeaderAttributeList_6();
            break;
        case 7:
            ChipLogProgress(
                chipTool, " ***** Test Step 7 : Read the optional attribute(SupportedStreamingProtocols): AttributeList\n");
            if (ShouldSkip("CONTENTLAUNCHER.S.A0001")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeSupportedStreamingProtocolsAttributeList_7();
            break;
        case 8:
            ChipLogProgress(
                chipTool, " ***** Test Step 8 : Read the optional command(LaunchContent) in AcceptedCommandList attribute\n");
            if (ShouldSkip("CONTENTLAUNCHER.C.C00.Tx")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandLaunchContentInAcceptedCommandListAttribute_8();
            break;
        case 9:
            ChipLogProgress(
                chipTool, " ***** Test Step 9 : Read the optional command(LaunchURL) in AcceptedCommandList attribute\n");
            if (ShouldSkip("CONTENTLAUNCHER.C.C01.Tx")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandLaunchURLInAcceptedCommandListAttribute_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_10();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 11;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenContentlauncherscsEnsureFeaturemapHasTheCorrectBitSet_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given CONTENTLAUNCHER.S.CS) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenContentlaunchersupEnsureFeaturemapHasTheCorrectBitSet_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given CONTENTLAUNCHER.S.UP ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeAcceptHeaderAttributeList_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(AcceptHeader): AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeSupportedStreamingProtocolsAttributeList_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(SupportedStreamingProtocols): AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalCommandLaunchContentInAcceptedCommandListAttribute_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional command(LaunchContent) in AcceptedCommandList attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalCommandLaunchURLInAcceptedCommandListAttribute_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional command(LaunchURL) in AcceptedCommandList attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 1UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 2UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_ALOGIN_1_12 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_ALOGIN_1_12()
        : TestCommandBridge("Test_TC_ALOGIN_1_12")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_ALOGIN_1_12() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_ALOGIN_1_12\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_ALOGIN_1_12\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_5();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 6;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 1UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_ALOGIN_12_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_ALOGIN_12_1()
        : TestCommandBridge("Test_TC_ALOGIN_12_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("TempAccountIdentifier", &mTempAccountIdentifier);
        AddArgument("catalogVendorId", 0, UINT16_MAX, &mCatalogVendorId);
        AddArgument("applicationId", &mApplicationId);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_ALOGIN_12_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_ALOGIN_12_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_ALOGIN_12_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Launch an app with the provided a application ID\n");
            if (ShouldSkip("APPLAUNCHER.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestLaunchAnAppWithTheProvidedAApplicationId_1();
            break;
        case 2:
            ChipLogProgress(chipTool,
                " ***** Test Step 2 : TH sends a GetSetupPIN command to the DUT with test values provided by the product maker.\n");
            if (ShouldSkip("ALOGIN.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAGetSetupPINCommandToTheDutWithTestValuesProvidedByTheProductMaker_2();
            break;
        case 3:
            ChipLogProgress(chipTool,
                " ***** Test Step 3 : TH sends a Login command to the DUT with test values provided by the product maker.\n");
            if (ShouldSkip("ALOGIN.S.C02.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsALoginCommandToTheDutWithTestValuesProvidedByTheProductMaker_3();
            break;
        case 4:
            ChipLogProgress(chipTool,
                " ***** Test Step 4 : TH sends a Logout command to the DUT with test values provided by the product maker.\n");
            if (ShouldSkip("ALOGIN.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsALogoutCommandToTheDutWithTestValuesProvidedByTheProductMaker_4();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 5;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<chip::CharSpan> mTempAccountIdentifier;
    chip::Optional<uint16_t> mCatalogVendorId;
    chip::Optional<chip::CharSpan> mApplicationId;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestLaunchAnAppWithTheProvidedAApplicationId_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
                                                                               endpointID:@(3)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRApplicationLauncherClusterLaunchAppParams alloc] init];
        params.application = [[MTRApplicationLauncherClusterApplicationStruct alloc] init];
        ((MTRApplicationLauncherClusterApplicationStruct *) params.application).catalogVendorID = mCatalogVendorId.HasValue()
            ? [NSNumber numberWithUnsignedShort:mCatalogVendorId.Value()]
            : [NSNumber numberWithUnsignedShort:123U];
        ((MTRApplicationLauncherClusterApplicationStruct *) params.application).applicationID = mApplicationId.HasValue()
            ? [[NSString alloc] initWithBytes:mApplicationId.Value().data()
                                       length:mApplicationId.Value().size()
                                     encoding:NSUTF8StringEncoding]
            : @"exampleid";

        params.data = [[NSData alloc] initWithBytes:"Hello World" length:11];
        [cluster
            launchAppWithParams:params
                     completion:^(MTRApplicationLauncherClusterLauncherResponseParams * _Nullable values, NSError * _Nullable err) {
                         NSLog(@"Launch an app with the provided a application ID Error: %@", err);

                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                         {
                             id actualValue = values.status;
                             VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                         }

                         NextTest();
                     }];

        return CHIP_NO_ERROR;
    }
    NSString * _Nonnull setupPIN;

    CHIP_ERROR TestThSendsAGetSetupPINCommandToTheDutWithTestValuesProvidedByTheProductMaker_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRAccountLoginClusterGetSetupPINParams alloc] init];
        params.tempAccountIdentifier = mTempAccountIdentifier.HasValue()
            ? [[NSString alloc] initWithBytes:mTempAccountIdentifier.Value().data()
                                       length:mTempAccountIdentifier.Value().size()
                                     encoding:NSUTF8StringEncoding]
            : @"1111";
        [cluster
            getSetupPINWithParams:params
                       completion:^(MTRAccountLoginClusterGetSetupPINResponseParams * _Nullable values, NSError * _Nullable err) {
                           NSLog(@"TH sends a GetSetupPIN command to the DUT with test values provided by the product maker. "
                                 @"Error: %@",
                               err);

                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                           {
                               setupPIN = values.setupPIN;
                           }

                           NextTest();
                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsALoginCommandToTheDutWithTestValuesProvidedByTheProductMaker_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRAccountLoginClusterLoginParams alloc] init];
        params.tempAccountIdentifier = mTempAccountIdentifier.HasValue()
            ? [[NSString alloc] initWithBytes:mTempAccountIdentifier.Value().data()
                                       length:mTempAccountIdentifier.Value().size()
                                     encoding:NSUTF8StringEncoding]
            : @"1111";
        params.setupPIN = [setupPIN copy];
        [cluster
            loginWithParams:params
                 completion:^(NSError * _Nullable err) {
                     NSLog(@"TH sends a Login command to the DUT with test values provided by the product maker. Error: %@", err);

                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                     NextTest();
                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsALogoutCommandToTheDutWithTestValuesProvidedByTheProductMaker_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster logoutWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends a Logout command to the DUT with test values provided by the product maker. Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_LOWPOWER_2_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_LOWPOWER_2_1()
        : TestCommandBridge("Test_TC_LOWPOWER_2_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_LOWPOWER_2_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_LOWPOWER_2_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_LOWPOWER_2_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH sends Sleep command to DUT\n");
            if (ShouldSkip("LOWPOWER.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsSleepCommandToDut_1();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 2;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThSendsSleepCommandToDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster sleepWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends Sleep command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_KEYPADINPUT_3_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_KEYPADINPUT_3_2()
        : TestCommandBridge("Test_TC_KEYPADINPUT_3_2")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_KEYPADINPUT_3_2() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_KEYPADINPUT_3_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_KEYPADINPUT_3_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH sends CEC Settings Keys(0x0A) to DUT\n");
            if (ShouldSkip("KEYPADINPUT.S.LK && KEYPADINPUT.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsCecSettingsKeys0x0AToDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH sends CEC Home Keys(0x09) to DUT\n");
            if (ShouldSkip("KEYPADINPUT.S.LK && KEYPADINPUT.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsCecHomeKeys0x09ToDut_2();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 3;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThSendsCecSettingsKeys0x0AToDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
        params.keyCode = [NSNumber numberWithUnsignedChar:10U];
        [cluster sendKeyWithParams:params
                        completion:^(MTRKeypadInputClusterSendKeyResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"TH sends CEC Settings Keys(0x0A) to DUT Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.status;
                                VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsCecHomeKeys0x09ToDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
        params.keyCode = [NSNumber numberWithUnsignedChar:9U];
        [cluster sendKeyWithParams:params
                        completion:^(MTRKeypadInputClusterSendKeyResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"TH sends CEC Home Keys(0x09) to DUT Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.status;
                                VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_KEYPADINPUT_3_3 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_KEYPADINPUT_3_3()
        : TestCommandBridge("Test_TC_KEYPADINPUT_3_3")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_KEYPADINPUT_3_3() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_KEYPADINPUT_3_3\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_KEYPADINPUT_3_3\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Send Numbers1\n");
            if (ShouldSkip("KEYPADINPUT.S.C00.Rsp && KEYPADINPUT.S.NK")) {
                NextTest();
                return;
            }
            err = TestSendNumbers1_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Send Numbers2\n");
            if (ShouldSkip("KEYPADINPUT.S.C00.Rsp && KEYPADINPUT.S.NK")) {
                NextTest();
                return;
            }
            err = TestSendNumbers2_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Send Numbers3\n");
            if (ShouldSkip("KEYPADINPUT.S.C00.Rsp && KEYPADINPUT.S.NK")) {
                NextTest();
                return;
            }
            err = TestSendNumbers3_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Send Numbers4\n");
            if (ShouldSkip("KEYPADINPUT.S.C00.Rsp && KEYPADINPUT.S.NK")) {
                NextTest();
                return;
            }
            err = TestSendNumbers4_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Send Numbers5\n");
            if (ShouldSkip("KEYPADINPUT.S.C00.Rsp && KEYPADINPUT.S.NK")) {
                NextTest();
                return;
            }
            err = TestSendNumbers5_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Send Numbers6\n");
            if (ShouldSkip("KEYPADINPUT.S.C00.Rsp && KEYPADINPUT.S.NK")) {
                NextTest();
                return;
            }
            err = TestSendNumbers6_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Send Numbers7\n");
            if (ShouldSkip("KEYPADINPUT.S.C00.Rsp && KEYPADINPUT.S.NK")) {
                NextTest();
                return;
            }
            err = TestSendNumbers7_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Send Numbers8\n");
            if (ShouldSkip("KEYPADINPUT.S.C00.Rsp && KEYPADINPUT.S.NK")) {
                NextTest();
                return;
            }
            err = TestSendNumbers8_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Send Numbers9\n");
            if (ShouldSkip("KEYPADINPUT.S.C00.Rsp && KEYPADINPUT.S.NK")) {
                NextTest();
                return;
            }
            err = TestSendNumbers9_9();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 10;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestSendNumbers1_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
        params.keyCode = [NSNumber numberWithUnsignedChar:33U];
        [cluster sendKeyWithParams:params
                        completion:^(MTRKeypadInputClusterSendKeyResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Send Numbers1 Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.status;
                                VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendNumbers2_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
        params.keyCode = [NSNumber numberWithUnsignedChar:34U];
        [cluster sendKeyWithParams:params
                        completion:^(MTRKeypadInputClusterSendKeyResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Send Numbers2 Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.status;
                                VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendNumbers3_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
        params.keyCode = [NSNumber numberWithUnsignedChar:35U];
        [cluster sendKeyWithParams:params
                        completion:^(MTRKeypadInputClusterSendKeyResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Send Numbers3 Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.status;
                                VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendNumbers4_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
        params.keyCode = [NSNumber numberWithUnsignedChar:36U];
        [cluster sendKeyWithParams:params
                        completion:^(MTRKeypadInputClusterSendKeyResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Send Numbers4 Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.status;
                                VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendNumbers5_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
        params.keyCode = [NSNumber numberWithUnsignedChar:37U];
        [cluster sendKeyWithParams:params
                        completion:^(MTRKeypadInputClusterSendKeyResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Send Numbers5 Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.status;
                                VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendNumbers6_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
        params.keyCode = [NSNumber numberWithUnsignedChar:38U];
        [cluster sendKeyWithParams:params
                        completion:^(MTRKeypadInputClusterSendKeyResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Send Numbers6 Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.status;
                                VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendNumbers7_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
        params.keyCode = [NSNumber numberWithUnsignedChar:39U];
        [cluster sendKeyWithParams:params
                        completion:^(MTRKeypadInputClusterSendKeyResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Send Numbers7 Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.status;
                                VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendNumbers8_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
        params.keyCode = [NSNumber numberWithUnsignedChar:40U];
        [cluster sendKeyWithParams:params
                        completion:^(MTRKeypadInputClusterSendKeyResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Send Numbers8 Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.status;
                                VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendNumbers9_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
        params.keyCode = [NSNumber numberWithUnsignedChar:41U];
        [cluster sendKeyWithParams:params
                        completion:^(MTRKeypadInputClusterSendKeyResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Send Numbers9 Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.status;
                                VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_APPLAUNCHER_3_5 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_APPLAUNCHER_3_5()
        : TestCommandBridge("Test_TC_APPLAUNCHER_3_5")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_APPLAUNCHER_3_5() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_APPLAUNCHER_3_5\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_APPLAUNCHER_3_5\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool,
                " ***** Test Step 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\n");
            if (ShouldSkip("APPLAUNCHER.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCatalogListAttributeFromTheDutAndWhereEachEntryInTheListIsACsaIssuedVendorIdOfTypeUnsigned16BitIntegerRangingBetween065536ForTheCatalog_1();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 2;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR
    TestThReadsCatalogListAttributeFromTheDutAndWhereEachEntryInTheListIsACsaIssuedVendorIdOfTypeUnsigned16BitIntegerRangingBetween065536ForTheCatalog_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCatalogListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"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 Error: %@",
                err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_APPLAUNCHER_3_6 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_APPLAUNCHER_3_6()
        : TestCommandBridge("Test_TC_APPLAUNCHER_3_6")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_APPLAUNCHER_3_6() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_APPLAUNCHER_3_6\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_APPLAUNCHER_3_6\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool,
                " ***** Test Step 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\n");
            if (ShouldSkip("APPLAUNCHER.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentAppAttributeFromTheDutAndVerifyTheInFocusApplicationAttributesWhichShouldIncludeTheDisplayApplicationIDtypeuint16CatalogVendorIDtypestringOrNullIfThereIsNoCurrentInFocusApplication_1();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 2;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR
    TestThReadsCurrentAppAttributeFromTheDutAndVerifyTheInFocusApplicationAttributesWhichShouldIncludeTheDisplayApplicationIDtypeuint16CatalogVendorIDtypestringOrNullIfThereIsNoCurrentInFocusApplication_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentAppWithCompletion:^(
            MTRApplicationLauncherClusterApplicationEPStruct * _Nullable value, NSError * _Nullable err) {
            NSLog(@"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 Error: %@",
                err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAINPUT_3_10 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_MEDIAINPUT_3_10()
        : TestCommandBridge("Test_TC_MEDIAINPUT_3_10")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_MEDIAINPUT_3_10() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_MEDIAINPUT_3_10\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_MEDIAINPUT_3_10\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool,
                " ***** Test Step 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)\n");
            if (ShouldSkip("MEDIAINPUT.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsTheInputListAttributeFromTheDutToShowListOfInputsAvailableAndVerifyListOfAvailableInputsSupportedByTheDeviceIsProvidedWhereEachEntryInTheListContainsAnIndextypeuint8InputTypeInputTypeEnumsNameTypeStringsAndDescriptionTypeString_1();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 2;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR
    TestThReadsTheInputListAttributeFromTheDutToShowListOfInputsAvailableAndVerifyListOfAvailableInputsSupportedByTheDeviceIsProvidedWhereEachEntryInTheListContainsAnIndextypeuint8InputTypeInputTypeEnumsNameTypeStringsAndDescriptionTypeString_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInputListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"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) Error: %@",
                err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAINPUT_3_11 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_MEDIAINPUT_3_11()
        : TestCommandBridge("Test_TC_MEDIAINPUT_3_11")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_MEDIAINPUT_3_11() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_MEDIAINPUT_3_11\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_MEDIAINPUT_3_11\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool,
                " ***** Test Step 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)\n");
            if (ShouldSkip("MEDIAINPUT.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsTheInputListAttributeFromTheDutToShowListOfInputsAvailableAndVerifyListOfAvailableInputsSupportedByTheDeviceIsProvidedWhereEachEntryInTheListContainsAnIndextypeuint8InputTypeInputTypeEnumsNameTypeStringsAndDescriptionTypeString_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Select Input Command\n");
            if (ShouldSkip("MEDIAINPUT.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestSelectInputCommand_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read current input list\n");
            if (ShouldSkip("MEDIAINPUT.S.A0001 && MEDIAINPUT.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadCurrentInputList_3();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 4;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR
    TestThReadsTheInputListAttributeFromTheDutToShowListOfInputsAvailableAndVerifyListOfAvailableInputsSupportedByTheDeviceIsProvidedWhereEachEntryInTheListContainsAnIndextypeuint8InputTypeInputTypeEnumsNameTypeStringsAndDescriptionTypeString_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInputListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"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) Error: %@",
                err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSelectInputCommand_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRMediaInputClusterSelectInputParams alloc] init];
        params.index = [NSNumber numberWithUnsignedChar:1U];
        [cluster selectInputWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"Select Input Command Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadCurrentInputList_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentInputWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read current input list Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentInput", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAINPUT_3_12 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_MEDIAINPUT_3_12()
        : TestCommandBridge("Test_TC_MEDIAINPUT_3_12")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_MEDIAINPUT_3_12() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_MEDIAINPUT_3_12\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_MEDIAINPUT_3_12\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool,
                " ***** Test Step 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)\n");
            if (ShouldSkip("MEDIAINPUT.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsTheInputListAttributeFromTheDutToShowListOfInputsAvailableAndVerifyListOfAvailableInputsSupportedByTheDeviceIsProvidedWhereEachEntryInTheListContainsAnIndextypeuint8InputTypeInputTypeEnumsNameTypeStringsAndDescriptionTypeString_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Show Input Status Command\n");
            if (ShouldSkip("MEDIAINPUT.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestShowInputStatusCommand_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Hide Input Status Command\n");
            if (ShouldSkip("MEDIAINPUT.S.C02.Rsp")) {
                NextTest();
                return;
            }
            err = TestHideInputStatusCommand_3();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 4;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR
    TestThReadsTheInputListAttributeFromTheDutToShowListOfInputsAvailableAndVerifyListOfAvailableInputsSupportedByTheDeviceIsProvidedWhereEachEntryInTheListContainsAnIndextypeuint8InputTypeInputTypeEnumsNameTypeStringsAndDescriptionTypeString_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInputListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"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) Error: %@",
                err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestShowInputStatusCommand_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster showInputStatusWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Show Input Status Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestHideInputStatusCommand_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster hideInputStatusWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Hide Input Status Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAINPUT_3_13 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_MEDIAINPUT_3_13()
        : TestCommandBridge("Test_TC_MEDIAINPUT_3_13")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_MEDIAINPUT_3_13() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_MEDIAINPUT_3_13\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_MEDIAINPUT_3_13\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(
                chipTool, " ***** Test Step 1 : TH reads the InputList attribute from the DUT to show list of Inputs available\n");
            if (ShouldSkip("MEDIAINPUT.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsTheInputListAttributeFromTheDutToShowListOfInputsAvailable_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Rename Input Command\n");
            if (ShouldSkip("MEDIAINPUT.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestRenameInputCommand_2();
            break;
        case 3:
            ChipLogProgress(
                chipTool, " ***** Test Step 3 : TH reads the InputList attribute from the DUT to show list of Inputs available\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAINPUT.S.A0000 && MEDIAINPUT.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsTheInputListAttributeFromTheDutToShowListOfInputsAvailable_3();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 4;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheInputListAttributeFromTheDutToShowListOfInputsAvailable_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInputListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the InputList attribute from the DUT to show list of Inputs available Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRenameInputCommand_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRMediaInputClusterRenameInputParams alloc] init];
        params.index = [NSNumber numberWithUnsignedChar:1U];
        params.name = @"A1";
        [cluster renameInputWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"Rename Input Command Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheInputListAttributeFromTheDutToShowListOfInputsAvailable_3()
    {

        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("alpha", value);
    }
};

class Test_TC_WAKEONLAN_4_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_WAKEONLAN_4_1()
        : TestCommandBridge("Test_TC_WAKEONLAN_4_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_WAKEONLAN_4_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_WAKEONLAN_4_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_WAKEONLAN_4_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads the MACAddress attribute from the DUT\n");
            if (ShouldSkip("WAKEONLAN.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsTheMACAddressAttributeFromTheDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH sends a Sleep command to DUT\n");
            if (ShouldSkip("LOWPOWER.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsASleepCommandToDut_2();
            break;
        case 3:
            ChipLogProgress(
                chipTool, " ***** Test Step 3 : TH sends a Wake-On LAN magic packet containing the MAC address from step 1\n");
            if (ShouldSkip("PICS_USER_PROMPT")) {
                NextTest();
                return;
            }
            err = TestThSendsAWakeOnLanMagicPacketContainingTheMacAddressFromStep1_3();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 4;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheMACAddressAttributeFromTheDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWakeOnLAN alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMACAddressWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the MACAddress attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinLength("MACAddress", value, 12));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsASleepCommandToDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster sleepWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends a Sleep command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsAWakeOnLanMagicPacketContainingTheMacAddressFromStep1_3()
    {

        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' after successgarbage: not in length on purpose", 30);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }
};

class Test_TC_CHANNEL_5_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_CHANNEL_5_1()
        : TestCommandBridge("Test_TC_CHANNEL_5_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_CHANNEL_5_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_CHANNEL_5_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_CHANNEL_5_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool,
                " ***** Test Step 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)\n");
            if (ShouldSkip("CHANNEL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsTheChannelListAttributeFromTheDutToShowListOfInputsAvailableAndVerifyThatTheResponseContainsAListOfTheKnownTvChannelsEachListElementShouldConsistOfTheFollowingMajorNumberUnsigned16BitIntegerMandatoryMinorNumberUnsigned16BitIntegerMandatoryNameStringOptionalCallSignStringOptionalAffiliateCallSignStringOptional_1();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 2;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR
    TestThReadsTheChannelListAttributeFromTheDutToShowListOfInputsAvailableAndVerifyThatTheResponseContainsAListOfTheKnownTvChannelsEachListElementShouldConsistOfTheFollowingMajorNumberUnsigned16BitIntegerMandatoryMinorNumberUnsigned16BitIntegerMandatoryNameStringOptionalCallSignStringOptionalAffiliateCallSignStringOptional_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeChannelListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"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) Error: %@",
                err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_CHANNEL_5_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_CHANNEL_5_2()
        : TestCommandBridge("Test_TC_CHANNEL_5_2")
        , mTestIndex(0)
    {
        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);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_CHANNEL_5_2() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_CHANNEL_5_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_CHANNEL_5_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Reads the ChannelList attribute\n");
            if (ShouldSkip("CHANNEL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadsTheChannelListAttribute_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH sends a ChangeChannelByNumber command\n");
            if (ShouldSkip("CHANNEL.S.C02.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAChangeChannelByNumberCommand_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Verify that the channel has changed on the device\n");
            if (ShouldSkip("PICS_USER_PROMPT && CHANNEL.S.C02.Rsp")) {
                NextTest();
                return;
            }
            err = TestVerifyThatTheChannelHasChangedOnTheDevice_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Reads the CurrentChannel attribute\n");
            if (ShouldSkip("CHANNEL.S.A0002 && CHANNEL.S.C02.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsTheCurrentChannelAttribute_4();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 5;

    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_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadsTheChannelListAttribute_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeChannelListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the ChannelList attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("channelList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsAChangeChannelByNumberCommand_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRChannelClusterChangeChannelByNumberParams alloc] init];
        params.majorNumber = mMajornumber.HasValue() ? [NSNumber numberWithUnsignedShort:mMajornumber.Value()]
                                                     : [NSNumber numberWithUnsignedShort:9U];
        params.minorNumber = mMinornumber.HasValue() ? [NSNumber numberWithUnsignedShort:mMinornumber.Value()]
                                                     : [NSNumber numberWithUnsignedShort:1U];
        [cluster changeChannelByNumberWithParams:params
                                      completion:^(NSError * _Nullable err) {
                                          NSLog(@"TH sends a ChangeChannelByNumber command Error: %@", err);

                                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                          NextTest();
                                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatTheChannelHasChangedOnTheDevice_3()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestReadsTheCurrentChannelAttribute_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentChannelWithCompletion:^(
            MTRChannelClusterChannelInfoStruct * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the CurrentChannel attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentChannel", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_CHANNEL_5_3 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_CHANNEL_5_3()
        : TestCommandBridge("Test_TC_CHANNEL_5_3")
        , mTestIndex(0)
    {
        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);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_CHANNEL_5_3() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_CHANNEL_5_3\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_CHANNEL_5_3\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool,
                " ***** Test Step 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\n");
            if (ShouldSkip("CHANNEL.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsTheLineupAttributeFromTheDutToShowListOfInputsAvailableAndVerifyThatTheResponseContainsALineupInfoObject_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Reads the ChannelList attribute from the DUT\n");
            if (ShouldSkip("CHANNEL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadsTheChannelListAttributeFromTheDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Reads the CurrentChannel attribute from the DUT\n");
            if (ShouldSkip("CHANNEL.S.A0002")) {
                NextTest();
                return;
            }
            err = TestReadsTheCurrentChannelAttributeFromTheDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Sends a SkipChannel command to the DUT\n");
            if (ShouldSkip("CHANNEL.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsASkipChannelCommandToTheDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Verify that the channel has changed on the device\n");
            if (ShouldSkip("PICS_USER_PROMPT && CHANNEL.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestVerifyThatTheChannelHasChangedOnTheDevice_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Reads the CurrentChannel attribute from the DUT\n");
            if (ShouldSkip("CHANNEL.S.A0002 && CHANNEL.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsTheCurrentChannelAttributeFromTheDut_6();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 7;

    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_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR
    TestThReadsTheLineupAttributeFromTheDutToShowListOfInputsAvailableAndVerifyThatTheResponseContainsALineupInfoObject_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLineupWithCompletion:^(MTRChannelClusterLineupInfoStruct * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the Lineup attribute from the DUT to show list of Inputs available and Verify that the response "
                  @"contains a lineup info object Error: %@",
                err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheChannelListAttributeFromTheDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeChannelListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the ChannelList attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("channelList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheCurrentChannelAttributeFromTheDut_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentChannelWithCompletion:^(
            MTRChannelClusterChannelInfoStruct * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the CurrentChannel attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentChannel", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendsASkipChannelCommandToTheDut_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRChannelClusterSkipChannelParams alloc] init];
        params.count = [NSNumber numberWithUnsignedShort:1U];
        [cluster skipChannelWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"Sends a SkipChannel command to the DUT Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatTheChannelHasChangedOnTheDevice_5()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestReadsTheCurrentChannelAttributeFromTheDut_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentChannelWithCompletion:^(
            MTRChannelClusterChannelInfoStruct * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the CurrentChannel attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentChannel", actualValue));
            }
            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("currentChannel", "ChannelInfoStruct", "ChannelInfoStruct"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAPLAYBACK_6_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_MEDIAPLAYBACK_6_1()
        : TestCommandBridge("Test_TC_MEDIAPLAYBACK_6_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_MEDIAPLAYBACK_6_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_MEDIAPLAYBACK_6_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_MEDIAPLAYBACK_6_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(
                chipTool, " ***** Test Step 1 : Precondition: Media content in a paused state at the beginning of the content\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestPreconditionMediaContentInAPausedStateAtTheBeginningOfTheContent_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Reads the CurrentState attribute\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0000 && MEDIAPLAYBACK.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsTheCurrentStateAttribute_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Sends a Play command\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsAPlayCommand_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Verify that the media state is playing\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestVerifyThatTheMediaStateIsPlaying_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Reads the CurrentState attribute\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0000 && MEDIAPLAYBACK.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsTheCurrentStateAttribute_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : sends a Pause command\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsAPauseCommand_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Verify that the media is paused\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestVerifyThatTheMediaIsPaused_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Reads the CurrentState attribute\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C01.Rsp && MEDIAPLAYBACK.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadsTheCurrentStateAttribute_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Sends a Stop command\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C02.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsAStopCommand_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Verify that the media is stoped\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C02.Rsp")) {
                NextTest();
                return;
            }
            err = TestVerifyThatTheMediaIsStoped_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Reads the CurrentState attribute\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0000 && MEDIAPLAYBACK.S.C02.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsTheCurrentStateAttribute_11();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 12;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestPreconditionMediaContentInAPausedStateAtTheBeginningOfTheContent_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster pauseWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
            NSLog(@"Precondition: Media content in a paused state at the beginning of the content Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = values.status;
                VerifyOrReturn(CheckValue("Status", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheCurrentStateAttribute_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the CurrentState attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentState", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendsAPlayCommand_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster playWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
            NSLog(@"Sends a Play command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = values.status;
                VerifyOrReturn(CheckValue("Status", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatTheMediaStateIsPlaying_4()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestReadsTheCurrentStateAttribute_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the CurrentState attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentState", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendsAPauseCommand_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster pauseWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
            NSLog(@"sends a Pause command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = values.status;
                VerifyOrReturn(CheckValue("Status", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatTheMediaIsPaused_7()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestReadsTheCurrentStateAttribute_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the CurrentState attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentState", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendsAStopCommand_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster stopWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
            NSLog(@"Sends a Stop command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = values.status;
                VerifyOrReturn(CheckValue("Status", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatTheMediaIsStoped_10()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestReadsTheCurrentStateAttribute_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the CurrentState attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentState", actualValue, 2U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAPLAYBACK_6_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_MEDIAPLAYBACK_6_2()
        : TestCommandBridge("Test_TC_MEDIAPLAYBACK_6_2")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_MEDIAPLAYBACK_6_2() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_MEDIAPLAYBACK_6_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_MEDIAPLAYBACK_6_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(
                chipTool, " ***** Test Step 1 : Precondition: Media content in a paused state at the beginning of the content\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestPreconditionMediaContentInAPausedStateAtTheBeginningOfTheContent_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Reads the CurrentState attribute from the DUT\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0000 && MEDIAPLAYBACK.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsTheCurrentStateAttributeFromTheDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Sends a Play command to the DUT\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsAPlayCommandToTheDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Verify that the media state is playing\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestVerifyThatTheMediaStateIsPlaying_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Reads the CurrentState attribute\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0000 && MEDIAPLAYBACK.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsTheCurrentStateAttribute_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Sends a StartOver command to the DUT\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsAStartOverCommandToTheDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Verify that the media is started over\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestVerifyThatTheMediaIsStartedOver_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Sends a Next command to the DUT\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C05.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsANextCommandToTheDut_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Verify that the next media item in the queue has been loaded\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C05.Rsp")) {
                NextTest();
                return;
            }
            err = TestVerifyThatTheNextMediaItemInTheQueueHasBeenLoaded_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Sends a Previous command to the DUT\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C04.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsAPreviousCommandToTheDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Verify that the previous media item in the queue has been loaded\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C04.Rsp")) {
                NextTest();
                return;
            }
            err = TestVerifyThatThePreviousMediaItemInTheQueueHasBeenLoaded_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Sends a SkipForward command to the DUT \n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsASkipForwardCommandToTheDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Verify that the media has skipped forward 10 seconds\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = TestVerifyThatTheMediaHasSkippedForward10Seconds_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Reads the SampledPosition attribute from the DUT\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0003 && MEDIAPLAYBACK.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsTheSampledPositionAttributeFromTheDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Sends a SkipBackward command to the DUT \n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C09.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsASkipBackwardCommandToTheDut_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Verify that the media has skipped backward 10 seconds\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C09.Rsp")) {
                NextTest();
                return;
            }
            err = TestVerifyThatTheMediaHasSkippedBackward10Seconds_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Reads the SampledPosition attribute from the DUT\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0003 && MEDIAPLAYBACK.S.C09.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsTheSampledPositionAttributeFromTheDut_17();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 18;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestPreconditionMediaContentInAPausedStateAtTheBeginningOfTheContent_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster pauseWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
            NSLog(@"Precondition: Media content in a paused state at the beginning of the content Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = values.status;
                VerifyOrReturn(CheckValue("Status", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheCurrentStateAttributeFromTheDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the CurrentState attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentState", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendsAPlayCommandToTheDut_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster playWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
            NSLog(@"Sends a Play command to the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = values.status;
                VerifyOrReturn(CheckValue("Status", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatTheMediaStateIsPlaying_4()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestReadsTheCurrentStateAttribute_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the CurrentState attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentState", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendsAStartOverCommandToTheDut_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            startOverWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
                NSLog(@"Sends a StartOver command to the DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                {
                    id actualValue = values.status;
                    VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatTheMediaIsStartedOver_7()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestSendsANextCommandToTheDut_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster nextWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
            NSLog(@"Sends a Next command to the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = values.status;
                VerifyOrReturn(CheckValue("Status", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatTheNextMediaItemInTheQueueHasBeenLoaded_9()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestSendsAPreviousCommandToTheDut_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            previousWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
                NSLog(@"Sends a Previous command to the DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                {
                    id actualValue = values.status;
                    VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatThePreviousMediaItemInTheQueueHasBeenLoaded_11()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestSendsASkipForwardCommandToTheDut_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRMediaPlaybackClusterSkipForwardParams alloc] init];
        params.deltaPositionMilliseconds = [NSNumber numberWithUnsignedLongLong:10000ULL];
        [cluster
            skipForwardWithParams:params
                       completion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
                           NSLog(@"Sends a SkipForward command to the DUT  Error: %@", err);

                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                           {
                               id actualValue = values.status;
                               VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                           }

                           NextTest();
                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatTheMediaHasSkippedForward10Seconds_13()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestReadsTheSampledPositionAttributeFromTheDut_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSampledPositionWithCompletion:^(
            MTRMediaPlaybackClusterPlaybackPositionStruct * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the SampledPosition attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("SampledPosition", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendsASkipBackwardCommandToTheDut_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRMediaPlaybackClusterSkipBackwardParams alloc] init];
        params.deltaPositionMilliseconds = [NSNumber numberWithUnsignedLongLong:10000ULL];
        [cluster
            skipBackwardWithParams:params
                        completion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Sends a SkipBackward command to the DUT  Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.status;
                                VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatTheMediaHasSkippedBackward10Seconds_16()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestReadsTheSampledPositionAttributeFromTheDut_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSampledPositionWithCompletion:^(
            MTRMediaPlaybackClusterPlaybackPositionStruct * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the SampledPosition attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("SampledPosition", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_MEDIAPLAYBACK_6_3 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_MEDIAPLAYBACK_6_3()
        : TestCommandBridge("Test_TC_MEDIAPLAYBACK_6_3")
        , mTestIndex(0)
    {
        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);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_MEDIAPLAYBACK_6_3() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_MEDIAPLAYBACK_6_3\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_MEDIAPLAYBACK_6_3\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(
                chipTool, " ***** Test Step 1 : Precondition: Media content in a paused state at the beginning of the content\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestPreconditionMediaContentInAPausedStateAtTheBeginningOfTheContent_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Sends a Seek command\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C0B.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsASeekCommand_2();
            break;
        case 3:
            ChipLogProgress(
                chipTool, " ***** Test Step 3 : Verify that the media has moved to 10 seconds from the starting point\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C0B.Rsp")) {
                NextTest();
                return;
            }
            err = TestVerifyThatTheMediaHasMovedTo10SecondsFromTheStartingPoint_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Reads the SampledPosition attribute\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0003 && MEDIAPLAYBACK.S.C0B.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsTheSampledPositionAttribute_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH reads the StartTime attribute from the DUT\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0001 && PICS_USER_PROMPT")) {
                NextTest();
                return;
            }
            err = TestThReadsTheStartTimeAttributeFromTheDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : TH reads the SeekRangeEnd attribute from the DUT\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.A0005")) {
                NextTest();
                return;
            }
            err = TestThReadsTheSeekRangeEndAttributeFromTheDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH reads the SeekRangeStart attribute from the DUT\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.A0006")) {
                NextTest();
                return;
            }
            err = TestThReadsTheSeekRangeStartAttributeFromTheDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : TH reads the Duration attribute from the DUT\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.A0002")) {
                NextTest();
                return;
            }
            err = TestThReadsTheDurationAttributeFromTheDut_8();
            break;
        case 9:
            ChipLogProgress(
                chipTool, " ***** Test Step 9 : Sends a Seek command Position value beyond the furthest valid position\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C0B.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsASeekCommandPositionValueBeyondTheFurthestValidPosition_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : verify that the media has not moved.\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C0B.Rsp")) {
                NextTest();
                return;
            }
            err = TestVerifyThatTheMediaHasNotMoved_10();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 11;

    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_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestPreconditionMediaContentInAPausedStateAtTheBeginningOfTheContent_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster pauseWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
            NSLog(@"Precondition: Media content in a paused state at the beginning of the content Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = values.status;
                VerifyOrReturn(CheckValue("Status", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendsASeekCommand_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRMediaPlaybackClusterSeekParams alloc] init];
        params.position = [NSNumber numberWithUnsignedLongLong:10000ULL];
        [cluster seekWithParams:params
                     completion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
                         NSLog(@"Sends a Seek command Error: %@", err);

                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                         {
                             id actualValue = values.status;
                             VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                         }

                         NextTest();
                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatTheMediaHasMovedTo10SecondsFromTheStartingPoint_3()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestReadsTheSampledPositionAttribute_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSampledPositionWithCompletion:^(
            MTRMediaPlaybackClusterPlaybackPositionStruct * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the SampledPosition attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("SampledPosition", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheStartTimeAttributeFromTheDut_5()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestThReadsTheSeekRangeEndAttributeFromTheDut_6()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestThReadsTheSeekRangeStartAttributeFromTheDut_7()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestThReadsTheDurationAttributeFromTheDut_8()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestSendsASeekCommandPositionValueBeyondTheFurthestValidPosition_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRMediaPlaybackClusterSeekParams alloc] init];
        params.position = mSeekPosition.HasValue() ? [NSNumber numberWithUnsignedLongLong:mSeekPosition.Value()]
                                                   : [NSNumber numberWithUnsignedLongLong:100000000ULL];
        [cluster seekWithParams:params
                     completion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
                         NSLog(@"Sends a Seek command Position value beyond the furthest valid position Error: %@", err);

                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                         {
                             id actualValue = values.status;
                             VerifyOrReturn(CheckValue("Status", actualValue, 5U));
                         }

                         NextTest();
                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatTheMediaHasNotMoved_10()
    {

        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' if media has not movedgarbage: not in length on purpose", 39);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }
};

class Test_TC_MEDIAPLAYBACK_6_4 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_MEDIAPLAYBACK_6_4()
        : TestCommandBridge("Test_TC_MEDIAPLAYBACK_6_4")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_MEDIAPLAYBACK_6_4() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_MEDIAPLAYBACK_6_4\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_MEDIAPLAYBACK_6_4\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(
                chipTool, " ***** Test Step 1 : Precondition: Media content in a paused state at the beginning of the content\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestPreconditionMediaContentInAPausedStateAtTheBeginningOfTheContent_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Reads the CurrentState attribute from the DUT\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0000 && MEDIAPLAYBACK.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsTheCurrentStateAttributeFromTheDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Reads the PlaybackSpeed attribute from the DUT\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0004 && MEDIAPLAYBACK.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsThePlaybackSpeedAttributeFromTheDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Sends a FastForward command\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsAFastForwardCommand_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : verify that the media state is playing\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestVerifyThatTheMediaStateIsPlaying_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Reads the CurrentState attribute\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0000 && MEDIAPLAYBACK.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsTheCurrentStateAttribute_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Reads the PlaybackSpeed attribute from the DUT\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0004 && MEDIAPLAYBACK.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsThePlaybackSpeedAttributeFromTheDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Sends a FastForward command\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsAFastForwardCommand_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : verify that the media play speed has increased.\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestVerifyThatTheMediaPlaySpeedHasIncreased_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Reads the PlaybackSpeed attribute from the DUT\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0004 && MEDIAPLAYBACK.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsThePlaybackSpeedAttributeFromTheDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Sends a Rewind command to the DUT\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C06.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsARewindCommandToTheDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : verify that the media play has reversed direction.\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C06.Rsp")) {
                NextTest();
                return;
            }
            err = TestVerifyThatTheMediaPlayHasReversedDirection_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Reads the CurrentState attribute\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0000 && MEDIAPLAYBACK.S.C06.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsTheCurrentStateAttribute_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Reads the PlaybackSpeed attribute from the DUT\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.A0004 && MEDIAPLAYBACK.S.C06.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsThePlaybackSpeedAttributeFromTheDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Sends a Rewind command to the DUT\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C06.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsARewindCommandToTheDut_15();
            break;
        case 16:
            ChipLogProgress(
                chipTool, " ***** Test Step 16 : verify that the media play speed has increased in the reverse direction.\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C06.Rsp")) {
                NextTest();
                return;
            }
            err = TestVerifyThatTheMediaPlaySpeedHasIncreasedInTheReverseDirection_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Reads the PlaybackSpeed attribute from the DUT\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.A0004 && MEDIAPLAYBACK.S.C06.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsThePlaybackSpeedAttributeFromTheDut_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Sends a Play command\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsAPlayCommand_18();
            break;
        case 19:
            ChipLogProgress(
                chipTool, " ***** Test Step 19 : verify that the media is has resumed playing forward at the default speed.\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestVerifyThatTheMediaIsHasResumedPlayingForwardAtTheDefaultSpeed_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Reads the PlaybackSpeed attribute from the DUT\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0004 && MEDIAPLAYBACK.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsThePlaybackSpeedAttributeFromTheDut_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Sends consecutive FastForward commands\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsConsecutiveFastForwardCommands_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : Sends consecutive Rewind commands\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C06.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsConsecutiveRewindCommands_22();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 23;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestPreconditionMediaContentInAPausedStateAtTheBeginningOfTheContent_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster pauseWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
            NSLog(@"Precondition: Media content in a paused state at the beginning of the content Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = values.status;
                VerifyOrReturn(CheckValue("Status", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheCurrentStateAttributeFromTheDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the CurrentState attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentState", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsThePlaybackSpeedAttributeFromTheDut_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePlaybackSpeedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the PlaybackSpeed attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("PlaybackSpeed", actualValue, 0.0f));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendsAFastForwardCommand_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            fastForwardWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
                NSLog(@"Sends a FastForward command Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                {
                    id actualValue = values.status;
                    VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatTheMediaStateIsPlaying_5()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestReadsTheCurrentStateAttribute_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the CurrentState attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentState", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsThePlaybackSpeedAttributeFromTheDut_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePlaybackSpeedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the PlaybackSpeed attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("PlaybackSpeed", actualValue, 1.0f));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendsAFastForwardCommand_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            fastForwardWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
                NSLog(@"Sends a FastForward command Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                {
                    id actualValue = values.status;
                    VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatTheMediaPlaySpeedHasIncreased_9()
    {

        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message
            = chip::Span<const char>("Please enter 'y' if media play speed has increased.garbage: not in length on purpose", 51);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestReadsThePlaybackSpeedAttributeFromTheDut_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePlaybackSpeedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the PlaybackSpeed attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("PlaybackSpeed", actualValue, 2.0f));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendsARewindCommandToTheDut_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster rewindWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
            NSLog(@"Sends a Rewind command to the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = values.status;
                VerifyOrReturn(CheckValue("Status", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatTheMediaPlayHasReversedDirection_12()
    {

        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message
            = chip::Span<const char>("Please enter 'y' if media play has reversed directiongarbage: not in length on purpose", 53);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestReadsTheCurrentStateAttribute_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the CurrentState attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentState", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsThePlaybackSpeedAttributeFromTheDut_14()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestSendsARewindCommandToTheDut_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster rewindWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
            NSLog(@"Sends a Rewind command to the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = values.status;
                VerifyOrReturn(CheckValue("Status", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatTheMediaPlaySpeedHasIncreasedInTheReverseDirection_16()
    {

        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>(
            "Please enter 'y' if media play speed has increased in the reverse directiongarbage: not in length on purpose", 75);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestReadsThePlaybackSpeedAttributeFromTheDut_17()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestSendsAPlayCommand_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster playWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
            NSLog(@"Sends a Play command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = values.status;
                VerifyOrReturn(CheckValue("Status", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatTheMediaIsHasResumedPlayingForwardAtTheDefaultSpeed_19()
    {

        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>(
            "Please enter 'y' if media is has resumed playing forward at the default speedgarbage: not in length on purpose", 77);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("ygarbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }

    CHIP_ERROR TestReadsThePlaybackSpeedAttributeFromTheDut_20()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePlaybackSpeedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the PlaybackSpeed attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("PlaybackSpeed", actualValue, 1.0f));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendsConsecutiveFastForwardCommands_21()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestSendsConsecutiveRewindCommands_22()
    {

        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("alpha", value);
    }
};

class Test_TC_AUDIOOUTPUT_7_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_AUDIOOUTPUT_7_1()
        : TestCommandBridge("Test_TC_AUDIOOUTPUT_7_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("Index", 0, UINT8_MAX, &mIndex);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_AUDIOOUTPUT_7_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_AUDIOOUTPUT_7_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_AUDIOOUTPUT_7_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Reads the OutputList attribute\n");
            if (ShouldSkip("AUDIOOUTPUT.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadsTheOutputListAttribute_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Sends a SelectAudioOutput command\n");
            if (ShouldSkip("AUDIOOUTPUT.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsASelectAudioOutputCommand_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Reads the CurrentOutput attribute\n");
            if (ShouldSkip("AUDIOOUTPUT.S.A0001 && AUDIOOUTPUT.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsTheCurrentOutputAttribute_3();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 4;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadsTheOutputListAttribute_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOutputListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the OutputList attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("outputList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendsASelectAudioOutputCommand_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRAudioOutputClusterSelectOutputParams alloc] init];
        params.index = mIndex.HasValue() ? [NSNumber numberWithUnsignedChar:mIndex.Value()] : [NSNumber numberWithUnsignedChar:1U];
        [cluster selectOutputWithParams:params
                             completion:^(NSError * _Nullable err) {
                                 NSLog(@"Sends a SelectAudioOutput command Error: %@", err);

                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                 NextTest();
                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheCurrentOutputAttribute_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentOutputWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the CurrentOutput attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentOutput", actualValue, mIndex.HasValue() ? mIndex.Value() : 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_AUDIOOUTPUT_7_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_AUDIOOUTPUT_7_2()
        : TestCommandBridge("Test_TC_AUDIOOUTPUT_7_2")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("Index", 0, UINT8_MAX, &mIndex);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_AUDIOOUTPUT_7_2() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_AUDIOOUTPUT_7_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_AUDIOOUTPUT_7_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Reads the OutputList attribute from the DUT\n");
            if (ShouldSkip("AUDIOOUTPUT.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadsTheOutputListAttributeFromTheDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Sends a RenameOutput command\n");
            if (ShouldSkip("AUDIOOUTPUT.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsARenameOutputCommand_2();
            break;
        case 3:
            ChipLogProgress(chipTool,
                " ***** Test Step 3 : Reads the OutputList attribute from the DUT Verify that the output at the index provided in "
                "step 2 has the name CertTest\n");
            if (ShouldSkip("PICS_USER_PROMPT && AUDIOOUTPUT.S.A0001 && AUDIOOUTPUT.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsTheOutputListAttributeFromTheDutVerifyThatTheOutputAtTheIndexProvidedInStep2HasTheNameCertTest_3();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 4;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }
    NSArray * _Nonnull audioOutputListValues;

    CHIP_ERROR TestReadsTheOutputListAttributeFromTheDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOutputListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the OutputList attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("outputList", "list", "list"));
            {
                audioOutputListValues = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendsARenameOutputCommand_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRAudioOutputClusterRenameOutputParams alloc] init];
        params.index = mIndex.HasValue() ? [NSNumber numberWithUnsignedChar:mIndex.Value()] : [NSNumber numberWithUnsignedChar:1U];
        params.name = @"CertTest";
        [cluster renameOutputWithParams:params
                             completion:^(NSError * _Nullable err) {
                                 NSLog(@"Sends a RenameOutput command Error: %@", err);

                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                 NextTest();
                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheOutputListAttributeFromTheDutVerifyThatTheOutputAtTheIndexProvidedInStep2HasTheNameCertTest_3()
    {

        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("alpha", value);
    }
};

class Test_TC_TGTNAV_8_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_TGTNAV_8_1()
        : TestCommandBridge("Test_TC_TGTNAV_8_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("targetvalue", 0, UINT8_MAX, &mTargetvalue);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_TGTNAV_8_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_TGTNAV_8_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_TGTNAV_8_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Reads the CurrentTarget attribute\n");
            if (ShouldSkip("TGTNAV.S.A0001")) {
                NextTest();
                return;
            }
            err = TestReadsTheCurrentTargetAttribute_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Reads the TargetList attribute\n");
            if (ShouldSkip("TGTNAV.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadsTheTargetListAttribute_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Sends a NavigateTarget command\n");
            if (ShouldSkip("TGTNAV.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsANavigateTargetCommand_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Reads the CurrentTarget attribute\n");
            if (ShouldSkip("TGTNAV.S.A0001 && TGTNAV.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsTheCurrentTargetAttribute_4();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 5;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadsTheCurrentTargetAttribute_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentTargetWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the CurrentTarget attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("currentTarget", "int8u", "int8u"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentTarget", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentTarget", [value unsignedCharValue], 255U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSArray * _Nonnull TargetListValues;

    CHIP_ERROR TestReadsTheTargetListAttribute_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the TargetList attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("targetList", "list", "list"));
            {
                TargetListValues = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendsANavigateTargetCommand_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRTargetNavigatorClusterNavigateTargetParams alloc] init];
        params.target = mTargetvalue.HasValue() ? [NSNumber numberWithUnsignedChar:mTargetvalue.Value()]
                                                : [NSNumber numberWithUnsignedChar:1U];
        [cluster navigateTargetWithParams:params
                               completion:^(MTRTargetNavigatorClusterNavigateTargetResponseParams * _Nullable values,
                                   NSError * _Nullable err) {
                                   NSLog(@"Sends a NavigateTarget command Error: %@", err);

                                   VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                   NextTest();
                               }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheCurrentTargetAttribute_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentTargetWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the CurrentTarget attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentTarget", actualValue, mTargetvalue.HasValue() ? mTargetvalue.Value() : 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_APBSC_9_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_APBSC_9_1()
        : TestCommandBridge("Test_TC_APBSC_9_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_APBSC_9_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_APBSC_9_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_APBSC_9_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Reads the VendorName attribute\n");
            if (ShouldSkip("APBSC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadsTheVendorNameAttribute_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Reads the VendorID attribute\n");
            if (ShouldSkip("APBSC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestReadsTheVendorIDAttribute_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Reads the ApplicationName attribute\n");
            if (ShouldSkip("APBSC.S.A0002")) {
                NextTest();
                return;
            }
            err = TestReadsTheApplicationNameAttribute_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Reads the ProductID attribute\n");
            if (ShouldSkip("APBSC.S.A0003")) {
                NextTest();
                return;
            }
            err = TestReadsTheProductIDAttribute_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Reads the Application attribute\n");
            if (ShouldSkip("APBSC.S.A0004")) {
                NextTest();
                return;
            }
            err = TestReadsTheApplicationAttribute_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Reads the Status attribute\n");
            if (ShouldSkip("APBSC.S.A0005")) {
                NextTest();
                return;
            }
            err = TestReadsTheStatusAttribute_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Reads the ApplicationVersion attribute\n");
            if (ShouldSkip("APBSC.S.A0006")) {
                NextTest();
                return;
            }
            err = TestReadsTheApplicationVersionAttribute_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Reads the AllowedVendorList attribute\n");
            if (ShouldSkip("APBSC.S.A0007")) {
                NextTest();
                return;
            }
            err = TestReadsTheAllowedVendorListAttribute_8();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 9;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadsTheVendorNameAttribute_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeVendorNameWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the VendorName attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("vendorName", "char_string", "char_string"));
            VerifyOrReturn(CheckConstraintMaxLength("vendorName", value, 32));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheVendorIDAttribute_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeVendorIDWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the VendorID attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("vendorID", "vendor_id", "vendor_id"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheApplicationNameAttribute_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeApplicationNameWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the ApplicationName attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("applicationName", "char_string", "char_string"));
            VerifyOrReturn(CheckConstraintMaxLength("applicationName", value, 256));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheProductIDAttribute_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeProductIDWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the ProductID attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("productID", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("productID", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("productID", [value unsignedShortValue], 65535U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheApplicationAttribute_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeApplicationWithCompletion:^(
            MTRApplicationBasicClusterApplicationStruct * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the Application attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("application", "ApplicationStruct", "ApplicationStruct"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheStatusAttribute_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the Status attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("status", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("status", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheApplicationVersionAttribute_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeApplicationVersionWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the ApplicationVersion attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("applicationVersion", "char_string", "char_string"));
            VerifyOrReturn(CheckConstraintMaxLength("applicationVersion", value, 32));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheAllowedVendorListAttribute_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAllowedVendorListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the AllowedVendorList attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("allowedVendorList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_CONTENTLAUNCHER_10_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_CONTENTLAUNCHER_10_1()
        : TestCommandBridge("Test_TC_CONTENTLAUNCHER_10_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_CONTENTLAUNCHER_10_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_CONTENTLAUNCHER_10_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_CONTENTLAUNCHER_10_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads the AcceptHeader attribute from the DUT\n");
            if (ShouldSkip("CONTENTLAUNCHER.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsTheAcceptHeaderAttributeFromTheDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads the SupportedStreamingProtocols attribute from the DUT\n");
            if (ShouldSkip("CONTENTLAUNCHER.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsTheSupportedStreamingProtocolsAttributeFromTheDut_2();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 3;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheAcceptHeaderAttributeFromTheDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptHeaderWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the AcceptHeader attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptHeader", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheSupportedStreamingProtocolsAttributeFromTheDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSupportedStreamingProtocolsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the SupportedStreamingProtocols attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("supportedStreamingProtocols", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_MOD_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_MOD_1_1()
        : TestCommandBridge("Test_TC_MOD_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_MOD_1_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_MOD_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_MOD_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads the ClusterRevision attribute from the DUT\n");
            err = TestThReadsTheClusterRevisionAttributeFromTheDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads the FeatureMap attribute from the DUT\n");
            if (ShouldSkip("MOD.S.F00")) {
                NextTest();
                return;
            }
            err = TestThReadsTheFeatureMapAttributeFromTheDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : TH reads the FeatureMap attribute from the DUT\n");
            if (ShouldSkip(" !MOD.S.F00 ")) {
                NextTest();
                return;
            }
            err = TestThReadsTheFeatureMapAttributeFromTheDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH reads the AttributeList attribute from the DUT\n");
            err = TestThReadsTheAttributeListAttributeFromTheDut_4();
            break;
        case 5:
            ChipLogProgress(
                chipTool, " ***** Test Step 5 : TH reads the optional attribute(StartUpMode) in AttributeList from the DUT\n");
            if (ShouldSkip("MOD.S.A0004")) {
                NextTest();
                return;
            }
            err = TestThReadsTheOptionalAttributeStartUpModeInAttributeListFromTheDut_5();
            break;
        case 6:
            ChipLogProgress(
                chipTool, " ***** Test Step 6 : TH reads the optional attribute(OnMode) in AttributeList from the DUT\n");
            if (ShouldSkip("MOD.S.A0005")) {
                NextTest();
                return;
            }
            err = TestThReadsTheOptionalAttributeOnModeInAttributeListFromTheDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_8();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 9;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheClusterRevisionAttributeFromTheDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the ClusterRevision attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheFeatureMapAttributeFromTheDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the FeatureMap attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 1UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheFeatureMapAttributeFromTheDut_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the FeatureMap attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheAttributeListAttributeFromTheDut_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the AttributeList attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 3UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheOptionalAttributeStartUpModeInAttributeListFromTheDut_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the optional attribute(StartUpMode) in AttributeList from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 4UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheOptionalAttributeOnModeInAttributeListFromTheDut_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the optional attribute(OnMode) in AttributeList from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 5UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class OTA_SuccessfulTransfer : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    OTA_SuccessfulTransfer()
        : TestCommandBridge("OTA_SuccessfulTransfer")
        , mTestIndex(0)
    {
        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);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~OTA_SuccessfulTransfer() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: OTA_SuccessfulTransfer\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: OTA_SuccessfulTransfer\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Create OTA image\n");
            err = TestCreateOtaImage_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Start the provider with an image\n");
            err = TestStartTheProviderWithAnImage_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Commission the provider from alpha\n");
            err = TestCommissionTheProviderFromAlpha_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Wait for the commissioned provider to be retrieved for alpha\n");
            err = TestWaitForTheCommissionedProviderToBeRetrievedForAlpha_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Install ACL for QueryImage\n");
            err = TestInstallAclForQueryImage_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Stop the requestor\n");
            err = TestStopTheRequestor_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Start the requestor with an OTA download path\n");
            err = TestStartTheRequestorWithAnOtaDownloadPath_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Wait for the commissioned requestor to be retrieved for alpha\n");
            err = TestWaitForTheCommissionedRequestorToBeRetrievedForAlpha_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Send an announce OTA provider command to the requestor\n");
            err = TestSendAnAnnounceOtaProviderCommandToTheRequestor_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Wait for transfer complete message\n");
            err = TestWaitForTransferCompleteMessage_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Compare original file to downloaded file\n");
            err = TestCompareOriginalFileToDownloadedFile_10();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 11;

    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_ERROR TestCreateOtaImage_0()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestStartTheProviderWithAnImage_1()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestCommissionTheProviderFromAlpha_2()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestWaitForTheCommissionedProviderToBeRetrievedForAlpha_3()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mProviderNodeId.HasValue() ? mProviderNodeId.Value() : 12648430ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestInstallAclForQueryImage_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id aclArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:112233ULL];
                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:3U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:2U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).subjects = nil;
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[0]).cluster = [NSNumber numberWithUnsignedInt:41UL];
                ((MTRAccessControlClusterTarget *) temp_3[0]).endpoint = nil;
                ((MTRAccessControlClusterTarget *) temp_3[0]).deviceType = nil;

                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).targets = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            aclArgument = temp_0;
        }
        [cluster writeAttributeACLWithValue:aclArgument
                                 completion:^(NSError * _Nullable err) {
                                     NSLog(@"Install ACL for QueryImage Error: %@", err);

                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestStopTheRequestor_5()
    {

        chip::app::Clusters::SystemCommands::Commands::Stop::Type value;
        return Stop("alpha", value);
    }

    CHIP_ERROR TestStartTheRequestorWithAnOtaDownloadPath_6()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestWaitForTheCommissionedRequestorToBeRetrievedForAlpha_7()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mRequestorNodeId.HasValue() ? mRequestorNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestSendAnAnnounceOtaProviderCommandToTheRequestor_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOTASoftwareUpdateRequestor alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTROTASoftwareUpdateRequestorClusterAnnounceOTAProviderParams alloc] init];
        params.providerNodeID = mProviderNodeId.HasValue() ? [NSNumber numberWithUnsignedLongLong:mProviderNodeId.Value()]
                                                           : [NSNumber numberWithUnsignedLongLong:12648430ULL];
        params.vendorID = [NSNumber numberWithUnsignedShort:0U];
        params.announcementReason = [NSNumber numberWithUnsignedChar:0U];
        params.endpoint
            = mEndpoint.HasValue() ? [NSNumber numberWithUnsignedShort:mEndpoint.Value()] : [NSNumber numberWithUnsignedShort:0U];
        [cluster announceOTAProviderWithParams:params
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Send an announce OTA provider command to the requestor Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWaitForTransferCompleteMessage_9()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestCompareOriginalFileToDownloadedFile_10()
    {

        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("alpha", value);
    }
};

class Test_TC_OCC_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_OCC_1_1()
        : TestCommandBridge("Test_TC_OCC_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_OCC_1_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_OCC_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_OCC_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_5();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 6;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 3U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_OCC_2_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_OCC_2_1()
        : TestCommandBridge("Test_TC_OCC_2_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_OCC_2_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_OCC_2_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_OCC_2_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Reads mandatory attribute constrains: Occupancy\n");
            if (ShouldSkip("OCC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadsMandatoryAttributeConstrainsOccupancy_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Reads mandatory attribute constrains: OccupancySensorType\n");
            if (ShouldSkip("OCC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestReadsMandatoryAttributeConstrainsOccupancySensorType_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Reads mandatory attribute constrains: OccupancySensorTypeBitmap\n");
            if (ShouldSkip("OCC.S.A0002")) {
                NextTest();
                return;
            }
            err = TestReadsMandatoryAttributeConstrainsOccupancySensorTypeBitmap_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Reads optional attribute: PIROccupiedToUnoccupiedDelay\n");
            if (ShouldSkip("OCC.S.A0010")) {
                NextTest();
                return;
            }
            err = TestReadsOptionalAttributePIROccupiedToUnoccupiedDelay_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Reads optional attribute constrains: PIRUnoccupiedToOccupiedDelay\n");
            if (ShouldSkip("OCC.S.A0011")) {
                NextTest();
                return;
            }
            err = TestReadsOptionalAttributeConstrainsPIRUnoccupiedToOccupiedDelay_5();
            break;
        case 6:
            ChipLogProgress(
                chipTool, " ***** Test Step 6 : Reads optional attribute constrains: PIRUnoccupiedToOccupiedThreshold\n");
            if (ShouldSkip("OCC.S.A0012")) {
                NextTest();
                return;
            }
            err = TestReadsOptionalAttributeConstrainsPIRUnoccupiedToOccupiedThreshold_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read optional attribute: UltrasonicOccupiedToUnoccupiedDelay\n");
            if (ShouldSkip("OCC.S.A0020")) {
                NextTest();
                return;
            }
            err = TestReadOptionalAttributeUltrasonicOccupiedToUnoccupiedDelay_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read attribute: UltrasonicUnoccupiedToOccupiedDelay\n");
            if (ShouldSkip("OCC.S.A0021")) {
                NextTest();
                return;
            }
            err = TestReadAttributeUltrasonicUnoccupiedToOccupiedDelay_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Read attribute: UltrasonicUnoccupiedToOccupiedThreshold\n");
            if (ShouldSkip("OCC.S.A0022")) {
                NextTest();
                return;
            }
            err = TestReadAttributeUltrasonicUnoccupiedToOccupiedThreshold_9();
            break;
        case 10:
            ChipLogProgress(
                chipTool, " ***** Test Step 10 : Reads optional attribute constrains: PhysicalContactOccupiedToUnoccupiedDelay\n");
            if (ShouldSkip("OCC.S.A0030")) {
                NextTest();
                return;
            }
            err = TestReadsOptionalAttributeConstrainsPhysicalContactOccupiedToUnoccupiedDelay_10();
            break;
        case 11:
            ChipLogProgress(
                chipTool, " ***** Test Step 11 : Reads optional attribute constrains: PhysicalContactUnoccupiedToOccupiedDelay\n");
            if (ShouldSkip("OCC.S.A0031")) {
                NextTest();
                return;
            }
            err = TestReadsOptionalAttributeConstrainsPhysicalContactUnoccupiedToOccupiedDelay_11();
            break;
        case 12:
            ChipLogProgress(chipTool,
                " ***** Test Step 12 : Reads optional attribute constrains: PhysicalContactUnoccupiedToOccupiedThreshold\n");
            if (ShouldSkip("OCC.S.A0032")) {
                NextTest();
                return;
            }
            err = TestReadsOptionalAttributeConstrainsPhysicalContactUnoccupiedToOccupiedThreshold_12();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 13;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadsMandatoryAttributeConstrainsOccupancy_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOccupancyWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads mandatory attribute constrains: Occupancy Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("occupancy", "bitmap8", "bitmap8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("occupancy", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("occupancy", [value unsignedCharValue], 1U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsMandatoryAttributeConstrainsOccupancySensorType_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOccupancySensorTypeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads mandatory attribute constrains: OccupancySensorType Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("occupancySensorType", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("occupancySensorType", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("occupancySensorType", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsMandatoryAttributeConstrainsOccupancySensorTypeBitmap_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOccupancySensorTypeBitmapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads mandatory attribute constrains: OccupancySensorTypeBitmap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("occupancySensorTypeBitmap", "bitmap8", "bitmap8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("occupancySensorTypeBitmap", [value unsignedCharValue], 1U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("occupancySensorTypeBitmap", [value unsignedCharValue], 7U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsOptionalAttributePIROccupiedToUnoccupiedDelay_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePIROccupiedToUnoccupiedDelayWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads optional attribute: PIROccupiedToUnoccupiedDelay Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("PIROccupiedToUnoccupiedDelay", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("PIROccupiedToUnoccupiedDelay", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("PIROccupiedToUnoccupiedDelay", [value unsignedShortValue], 65535U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsOptionalAttributeConstrainsPIRUnoccupiedToOccupiedDelay_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePIRUnoccupiedToOccupiedDelayWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads optional attribute constrains: PIRUnoccupiedToOccupiedDelay Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("PIRUnoccupiedToOccupiedDelay", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("PIRUnoccupiedToOccupiedDelay", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("PIRUnoccupiedToOccupiedDelay", [value unsignedShortValue], 65535U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsOptionalAttributeConstrainsPIRUnoccupiedToOccupiedThreshold_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePIRUnoccupiedToOccupiedThresholdWithCompletion:^(
            NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads optional attribute constrains: PIRUnoccupiedToOccupiedThreshold Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("PIRUnoccupiedToOccupiedThreshold", "int8u", "int8u"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("PIRUnoccupiedToOccupiedThreshold", [value unsignedCharValue], 1U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("PIRUnoccupiedToOccupiedThreshold", [value unsignedCharValue], 254U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadOptionalAttributeUltrasonicOccupiedToUnoccupiedDelay_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeUltrasonicOccupiedToUnoccupiedDelayWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"Read optional attribute: UltrasonicOccupiedToUnoccupiedDelay Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                VerifyOrReturn(CheckConstraintType("ultrasonicOccupiedToUnoccupiedDelay", "int16u", "int16u"));
                VerifyOrReturn(
                    CheckConstraintMinValue<uint16_t>("ultrasonicOccupiedToUnoccupiedDelay", [value unsignedShortValue], 0U));
                VerifyOrReturn(
                    CheckConstraintMaxValue<uint16_t>("ultrasonicOccupiedToUnoccupiedDelay", [value unsignedShortValue], 65535U));

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeUltrasonicUnoccupiedToOccupiedDelay_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeUltrasonicUnoccupiedToOccupiedDelayWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"Read attribute: UltrasonicUnoccupiedToOccupiedDelay Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                VerifyOrReturn(CheckConstraintType("ultrasonicUnoccupiedToOccupiedDelay", "int16u", "int16u"));
                VerifyOrReturn(
                    CheckConstraintMinValue<uint16_t>("ultrasonicUnoccupiedToOccupiedDelay", [value unsignedShortValue], 0U));
                VerifyOrReturn(
                    CheckConstraintMaxValue<uint16_t>("ultrasonicUnoccupiedToOccupiedDelay", [value unsignedShortValue], 65535U));

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeUltrasonicUnoccupiedToOccupiedThreshold_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeUltrasonicUnoccupiedToOccupiedThresholdWithCompletion:^(
            NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute: UltrasonicUnoccupiedToOccupiedThreshold Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("ultrasonicUnoccupiedToOccupiedThreshold", "int8u", "int8u"));
            VerifyOrReturn(
                CheckConstraintMinValue<uint8_t>("ultrasonicUnoccupiedToOccupiedThreshold", [value unsignedCharValue], 1U));
            VerifyOrReturn(
                CheckConstraintMaxValue<uint8_t>("ultrasonicUnoccupiedToOccupiedThreshold", [value unsignedCharValue], 254U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsOptionalAttributeConstrainsPhysicalContactOccupiedToUnoccupiedDelay_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePhysicalContactOccupiedToUnoccupiedDelayWithCompletion:^(
            NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads optional attribute constrains: PhysicalContactOccupiedToUnoccupiedDelay Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("physicalContactOccupiedToUnoccupiedDelay", "int16u", "int16u"));
            VerifyOrReturn(
                CheckConstraintMinValue<uint16_t>("physicalContactOccupiedToUnoccupiedDelay", [value unsignedShortValue], 0U));
            VerifyOrReturn(
                CheckConstraintMaxValue<uint16_t>("physicalContactOccupiedToUnoccupiedDelay", [value unsignedShortValue], 65535U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsOptionalAttributeConstrainsPhysicalContactUnoccupiedToOccupiedDelay_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePhysicalContactUnoccupiedToOccupiedDelayWithCompletion:^(
            NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads optional attribute constrains: PhysicalContactUnoccupiedToOccupiedDelay Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("physicalContactUnoccupiedToOccupiedDelay", "int16u", "int16u"));
            VerifyOrReturn(
                CheckConstraintMinValue<uint16_t>("physicalContactUnoccupiedToOccupiedDelay", [value unsignedShortValue], 0U));
            VerifyOrReturn(
                CheckConstraintMaxValue<uint16_t>("physicalContactUnoccupiedToOccupiedDelay", [value unsignedShortValue], 65535U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsOptionalAttributeConstrainsPhysicalContactUnoccupiedToOccupiedThreshold_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePhysicalContactUnoccupiedToOccupiedThresholdWithCompletion:^(
            NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads optional attribute constrains: PhysicalContactUnoccupiedToOccupiedThreshold Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("physicalContactUnoccupiedToOccupiedThreshold", "int8u", "int8u"));
            VerifyOrReturn(
                CheckConstraintMinValue<uint8_t>("physicalContactUnoccupiedToOccupiedThreshold", [value unsignedCharValue], 1U));
            VerifyOrReturn(
                CheckConstraintMaxValue<uint8_t>("physicalContactUnoccupiedToOccupiedThreshold", [value unsignedCharValue], 254U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_OCC_2_3 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_OCC_2_3()
        : TestCommandBridge("Test_TC_OCC_2_3")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_OCC_2_3() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_OCC_2_3\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_OCC_2_3\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Reads mandatory attribute constrains: OccupancySensorType\n");
            if (ShouldSkip("OCC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestReadsMandatoryAttributeConstrainsOccupancySensorType_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Reads mandatory attribute constrains: OccupancySensorTypeBitmap\n");
            if (ShouldSkip("OCC.S.A0002")) {
                NextTest();
                return;
            }
            err = TestReadsMandatoryAttributeConstrainsOccupancySensorTypeBitmap_2();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 3;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadsMandatoryAttributeConstrainsOccupancySensorType_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOccupancySensorTypeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads mandatory attribute constrains: OccupancySensorType Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("occupancySensorType", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("occupancySensorType", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("occupancySensorType", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsMandatoryAttributeConstrainsOccupancySensorTypeBitmap_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOccupancySensorTypeBitmapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads mandatory attribute constrains: OccupancySensorTypeBitmap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("occupancySensorTypeBitmap", "bitmap8", "bitmap8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("occupancySensorTypeBitmap", [value unsignedCharValue], 1U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("occupancySensorTypeBitmap", [value unsignedCharValue], 7U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_OO_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_OO_1_1()
        : TestCommandBridge("Test_TC_OO_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_OO_1_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_OO_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_OO_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            if (ShouldSkip(" !OO.S.F00 ")) {
                NextTest();
                return;
            }
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Given OO.S.F00(LT) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("OO.S.F00")) {
                NextTest();
                return;
            }
            err = TestGivenOosf00ltEnsureFeaturemapHasTheCorrectBitSet_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the feature dependent(OO.S.F00) attribute in AttributeList\n");
            if (ShouldSkip("OO.S.F00")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentOOSF00AttributeInAttributeList_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_6();
            break;
        case 7:
            ChipLogProgress(
                chipTool, " ***** Test Step 7 : Read the feature dependent(OO.S.F00) commands in AcceptedCommandList\n");
            if (ShouldSkip("OO.S.F00")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentOOSF00CommandsInAcceptedCommandList_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_8();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 9;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 4U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenOosf00ltEnsureFeaturemapHasTheCorrectBitSet_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given OO.S.F00(LT) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheFeatureDependentOOSF00AttributeInAttributeList_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the feature dependent(OO.S.F00) attribute in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 16384UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 16385UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 16386UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 16387UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 2UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheFeatureDependentOOSF00CommandsInAcceptedCommandList_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the feature dependent(OO.S.F00) commands in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 64UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 65UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 66UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_OO_2_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_OO_2_1()
        : TestCommandBridge("Test_TC_OO_2_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_OO_2_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_OO_2_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_OO_2_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read the mandatory attribute: OnOff\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadTheMandatoryAttributeOnOff_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read LT attribute: GlobalSceneControl\n");
            if (ShouldSkip("OO.S.A4000")) {
                NextTest();
                return;
            }
            err = TestReadLtAttributeGlobalSceneControl_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read LT attribute: OnTime\n");
            if (ShouldSkip("OO.S.A4001")) {
                NextTest();
                return;
            }
            err = TestReadLtAttributeOnTime_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read LT attribute: OffWaitTime\n");
            if (ShouldSkip("OO.S.A4002")) {
                NextTest();
                return;
            }
            err = TestReadLtAttributeOffWaitTime_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read LT attribute: StartUpOnOff\n");
            if (ShouldSkip("OO.S.A4003")) {
                NextTest();
                return;
            }
            err = TestReadLtAttributeStartUpOnOff_5();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 6;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheMandatoryAttributeOnOff_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the mandatory attribute: OnOff Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("onOff", "boolean", "boolean"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadLtAttributeGlobalSceneControl_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGlobalSceneControlWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read LT attribute: GlobalSceneControl Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("globalSceneControl", "boolean", "boolean"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadLtAttributeOnTime_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read LT attribute: OnTime Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("onTime", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("onTime", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("onTime", [value unsignedShortValue], 65535U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadLtAttributeOffWaitTime_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOffWaitTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read LT attribute: OffWaitTime Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("offWaitTime", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("offWaitTime", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("offWaitTime", [value unsignedShortValue], 65535U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadLtAttributeStartUpOnOff_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeStartUpOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read LT attribute: StartUpOnOff Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("startUpOnOff", "enum8", "enum8"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_OO_2_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_OO_2_2()
        : TestCommandBridge("Test_TC_OO_2_2")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_OO_2_2() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_OO_2_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_OO_2_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Send Off Command\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendOffCommand_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Check on/off attribute value is false after off command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsFalseAfterOffCommand_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Send On Command\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendOnCommand_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Check on/off attribute value is true after on command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsTrueAfterOnCommand_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Send On Command\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendOnCommand_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Check on/off attribute value is true after on command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsTrueAfterOnCommand_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Send Off Command\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendOffCommand_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Check on/off attribute value is false after off command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsFalseAfterOffCommand_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Send Off Command\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendOffCommand_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Check on/off attribute value is false after off command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsFalseAfterOffCommand_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Send Toggle Command\n");
            if (ShouldSkip("OO.S.C02.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendToggleCommand_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Wait 1000ms\n");
            err = TestWait1000ms_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Check on/off attribute value is true after toggle command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsTrueAfterToggleCommand_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Send Toggle Command\n");
            if (ShouldSkip("OO.S.C02.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendToggleCommand_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Wait 1000ms\n");
            err = TestWait1000ms_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Check on/off attribute value is false after toggle command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsFalseAfterToggleCommand_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Operate on device to set OnOff attribute manually to on\n");
            if (ShouldSkip("PICS_USER_PROMPT && OO.M.ManuallyControlled && OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestOperateOnDeviceToSetOnOffAttributeManuallyToOn_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Check on/off attribute value is true after on command\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP && OO.S.A0000 && OO.M.ManuallyControlled")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsTrueAfterOnCommand_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Operate on device to set OnOff attribute manually to off\n");
            if (ShouldSkip("PICS_USER_PROMPT && OO.M.ManuallyControlled && OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestOperateOnDeviceToSetOnOffAttributeManuallyToOff_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Check on/off attribute value is false after off command\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP && OO.S.A0000 && OO.M.ManuallyControlled")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsFalseAfterOffCommand_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Reset Off Command\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestResetOffCommand_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : Check on/off attribute value is false after off command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsFalseAfterOffCommand_22();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 23;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestSendOffCommand_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Send Off Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is false after off command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendOnCommand_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Send On Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsTrueAfterOnCommand_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is true after on command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 1));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendOnCommand_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Send On Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsTrueAfterOnCommand_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is true after on command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 1));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendOffCommand_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Send Off Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is false after off command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendOffCommand_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Send Off Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is false after off command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendToggleCommand_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster toggleWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Send Toggle Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait1000ms_12()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 1000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsTrueAfterToggleCommand_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is true after toggle command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 1));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendToggleCommand_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster toggleWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Send Toggle Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait1000ms_15()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 1000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterToggleCommand_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is false after toggle command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestOperateOnDeviceToSetOnOffAttributeManuallyToOn_17()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsTrueAfterOnCommand_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is true after on command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 1));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestOperateOnDeviceToSetOnOffAttributeManuallyToOff_19()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_20()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is false after off command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestResetOffCommand_21()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Reset Off Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_22()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is false after off command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_OO_2_4 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_OO_2_4()
        : TestCommandBridge("Test_TC_OO_2_4")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_OO_2_4() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_OO_2_4\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_OO_2_4\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH sends On command to DUT\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH writes a value of 0 to StartUpOnOff attribute of DUT\n");
            if (ShouldSkip("OO.S.A4003")) {
                NextTest();
                return;
            }
            err = TestThWritesAValueOf0ToStartUpOnOffAttributeOfDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Reboot target device\n");
            if (ShouldSkip("PICS_SDK_CI_ONLY")) {
                NextTest();
                return;
            }
            err = TestRebootTargetDevice_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Reboot target device(DUT)\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP")) {
                NextTest();
                return;
            }
            err = TestRebootTargetDeviceDUT_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : TH reads the OnOff attribute from the DUT\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsTheOnOffAttributeFromTheDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH writes a value of 1 to StartUpOnOff attribute of DUT\n");
            if (ShouldSkip("OO.S.A4003")) {
                NextTest();
                return;
            }
            err = TestThWritesAValueOf1ToStartUpOnOffAttributeOfDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Reboot target device\n");
            if (ShouldSkip("PICS_SDK_CI_ONLY")) {
                NextTest();
                return;
            }
            err = TestRebootTargetDevice_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Reboot target device(DUT)\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP")) {
                NextTest();
                return;
            }
            err = TestRebootTargetDeviceDUT_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : TH reads the OnOff attribute from the DUT\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsTheOnOffAttributeFromTheDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : TH writes a value of 2 to StartUpOnOff attribute of DUT\n");
            if (ShouldSkip("OO.S.A4003")) {
                NextTest();
                return;
            }
            err = TestThWritesAValueOf2ToStartUpOnOffAttributeOfDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Reboot target device\n");
            if (ShouldSkip("PICS_SDK_CI_ONLY")) {
                NextTest();
                return;
            }
            err = TestRebootTargetDevice_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Reboot target device(DUT)\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP")) {
                NextTest();
                return;
            }
            err = TestRebootTargetDeviceDUT_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : TH reads the OnOff attribute from the DUT\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsTheOnOffAttributeFromTheDut_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Reboot target device\n");
            if (ShouldSkip("PICS_SDK_CI_ONLY")) {
                NextTest();
                return;
            }
            err = TestRebootTargetDevice_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Reboot target device(DUT)\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP")) {
                NextTest();
                return;
            }
            err = TestRebootTargetDeviceDUT_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : TH reads the OnOff attribute from the DUT\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsTheOnOffAttributeFromTheDut_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : TH writes NULL to StartUpOnOff attribute of DUT\n");
            if (ShouldSkip("OO.S.A4003")) {
                NextTest();
                return;
            }
            err = TestThWritesNullToStartUpOnOffAttributeOfDut_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : Reboot target device\n");
            if (ShouldSkip("PICS_SDK_CI_ONLY")) {
                NextTest();
                return;
            }
            err = TestRebootTargetDevice_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : Reboot target device(DUT)\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP")) {
                NextTest();
                return;
            }
            err = TestRebootTargetDeviceDUT_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : TH reads the OnOff attribute from the DUT\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsTheOnOffAttributeFromTheDut_25();
            break;
        case 26:
            ChipLogProgress(chipTool, " ***** Test Step 26 : TH sends Off command to DUT\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOffCommandToDut_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : Reboot target device\n");
            if (ShouldSkip("PICS_SDK_CI_ONLY")) {
                NextTest();
                return;
            }
            err = TestRebootTargetDevice_27();
            break;
        case 28:
            ChipLogProgress(chipTool, " ***** Test Step 28 : Reboot target device(DUT)\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP")) {
                NextTest();
                return;
            }
            err = TestRebootTargetDeviceDUT_28();
            break;
        case 29:
            ChipLogProgress(chipTool, " ***** Test Step 29 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_29();
            break;
        case 30:
            ChipLogProgress(chipTool, " ***** Test Step 30 : TH reads the OnOff attribute from the DUT\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsTheOnOffAttributeFromTheDut_30();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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));
            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));
            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));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 31;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThSendsOnCommandToDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends On command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesAValueOf0ToStartUpOnOffAttributeOfDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id startUpOnOffArgument;
        startUpOnOffArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeStartUpOnOffWithValue:startUpOnOffArgument
                                          completion:^(NSError * _Nullable err) {
                                              NSLog(@"TH writes a value of 0 to StartUpOnOff attribute of DUT Error: %@", err);

                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                              NextTest();
                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRebootTargetDevice_3()
    {

        chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
        return Reboot("alpha", value);
    }

    CHIP_ERROR TestRebootTargetDeviceDUT_4()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_5()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheOnOffAttributeFromTheDut_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the OnOff attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesAValueOf1ToStartUpOnOffAttributeOfDut_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id startUpOnOffArgument;
        startUpOnOffArgument = [NSNumber numberWithUnsignedChar:1U];
        [cluster writeAttributeStartUpOnOffWithValue:startUpOnOffArgument
                                          completion:^(NSError * _Nullable err) {
                                              NSLog(@"TH writes a value of 1 to StartUpOnOff attribute of DUT Error: %@", err);

                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                              NextTest();
                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRebootTargetDevice_8()
    {

        chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
        return Reboot("alpha", value);
    }

    CHIP_ERROR TestRebootTargetDeviceDUT_9()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_10()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheOnOffAttributeFromTheDut_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the OnOff attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 1));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesAValueOf2ToStartUpOnOffAttributeOfDut_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id startUpOnOffArgument;
        startUpOnOffArgument = [NSNumber numberWithUnsignedChar:2U];
        [cluster writeAttributeStartUpOnOffWithValue:startUpOnOffArgument
                                          completion:^(NSError * _Nullable err) {
                                              NSLog(@"TH writes a value of 2 to StartUpOnOff attribute of DUT Error: %@", err);

                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                              NextTest();
                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRebootTargetDevice_13()
    {

        chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
        return Reboot("alpha", value);
    }

    CHIP_ERROR TestRebootTargetDeviceDUT_14()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_15()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheOnOffAttributeFromTheDut_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the OnOff attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRebootTargetDevice_17()
    {

        chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
        return Reboot("alpha", value);
    }

    CHIP_ERROR TestRebootTargetDeviceDUT_18()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_19()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheOnOffAttributeFromTheDut_20()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the OnOff attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 1));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesNullToStartUpOnOffAttributeOfDut_21()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id startUpOnOffArgument;
        startUpOnOffArgument = nil;
        [cluster writeAttributeStartUpOnOffWithValue:startUpOnOffArgument
                                          completion:^(NSError * _Nullable err) {
                                              NSLog(@"TH writes NULL to StartUpOnOff attribute of DUT Error: %@", err);

                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                              NextTest();
                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRebootTargetDevice_22()
    {

        chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
        return Reboot("alpha", value);
    }

    CHIP_ERROR TestRebootTargetDeviceDUT_23()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_24()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheOnOffAttributeFromTheDut_25()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the OnOff attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 1));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsOffCommandToDut_26()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends Off command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRebootTargetDevice_27()
    {

        chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
        return Reboot("alpha", value);
    }

    CHIP_ERROR TestRebootTargetDeviceDUT_28()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_29()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheOnOffAttributeFromTheDut_30()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the OnOff attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_PS_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_PS_1_1()
        : TestCommandBridge("Test_TC_PS_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_PS_1_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_PS_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_PS_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            if (ShouldSkip(" !PS.S.F00 && !PS.S.F01 && !PS.S.F02 && !PS.S.F03 ")) {
                NextTest();
                return;
            }
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Given PS.S.F00(WIRED) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("PS.S.F00")) {
                NextTest();
                return;
            }
            err = TestGivenPssf00wiredEnsureFeaturemapHasTheCorrectBitSet_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Given PS.S.F01(BAT) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("PS.S.F01")) {
                NextTest();
                return;
            }
            err = TestGivenPssf01batEnsureFeaturemapHasTheCorrectBitSet_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Given PS.S.F02(RECHG) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("PS.S.F02")) {
                NextTest();
                return;
            }
            err = TestGivenPssf02rechgEnsureFeaturemapHasTheCorrectBitSet_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Given PS.S.F03(REPLC) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("PS.S.F03")) {
                NextTest();
                return;
            }
            err = TestGivenPssf03replcEnsureFeaturemapHasTheCorrectBitSet_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_7();
            break;
        case 8:
            ChipLogProgress(
                chipTool, " ***** Test Step 8 : Read the Feature dependent(PS.S.F00-WIRED) attribute in AttributeList\n");
            if (ShouldSkip("PS.S.F00")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentPSSF00WiredAttributeInAttributeList_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Read the Feature dependent(PS.S.F01-BAT) attribute in AttributeList\n");
            if (ShouldSkip("PS.S.F01")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentPSSF01BatAttributeInAttributeList_9();
            break;
        case 10:
            ChipLogProgress(
                chipTool, " ***** Test Step 10 : Read the Feature dependent(PS.S.F02-RECHG) attribute in AttributeList\n");
            if (ShouldSkip("PS.S.F02")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentPSSF02RechgAttributeInAttributeList_10();
            break;
        case 11:
            ChipLogProgress(
                chipTool, " ***** Test Step 11 : Read the Feature dependent(PS.S.F03-REPLC) attribute in AttributeList\n");
            if (ShouldSkip("PS.S.F03")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentPSSF03ReplcAttributeInAttributeList_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_13();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 14;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenPssf00wiredEnsureFeaturemapHasTheCorrectBitSet_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given PS.S.F00(WIRED) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenPssf01batEnsureFeaturemapHasTheCorrectBitSet_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given PS.S.F01(BAT) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenPssf02rechgEnsureFeaturemapHasTheCorrectBitSet_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given PS.S.F02(RECHG) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenPssf03replcEnsureFeaturemapHasTheCorrectBitSet_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given PS.S.F03(REPLC) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheFeatureDependentPSSF00WiredAttributeInAttributeList_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the Feature dependent(PS.S.F00-WIRED) attribute in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 5UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheFeatureDependentPSSF01BatAttributeInAttributeList_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the Feature dependent(PS.S.F01-BAT) attribute in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 14UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 15UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 16UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheFeatureDependentPSSF02RechgAttributeInAttributeList_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the Feature dependent(PS.S.F02-RECHG) attribute in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 26UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 28UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheFeatureDependentPSSF03ReplcAttributeInAttributeList_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the Feature dependent(PS.S.F03-REPLC) attribute in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 19UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 25UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_PS_2_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_PS_2_1()
        : TestCommandBridge("Test_TC_PS_2_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_PS_2_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_PS_2_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_PS_2_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Test Harness Client reads Status attribute from Server DUT\n");
            if (ShouldSkip("PS.S.A0000")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsStatusAttributeFromServerDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Test Harness Client reads Order attribute from Server DUT\n");
            if (ShouldSkip("PS.S.A0001")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsOrderAttributeFromServerDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Test Harness Client reads Description attribute from Server DUT\n");
            if (ShouldSkip("PS.S.A0002")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsDescriptionAttributeFromServerDut_3();
            break;
        case 4:
            ChipLogProgress(
                chipTool, " ***** Test Step 4 : Test Harness Client reads WiredAssessedInputVoltage attribue from Server DUT\n");
            if (ShouldSkip("PS.S.A0003")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsWiredAssessedInputVoltageAttribueFromServerDut_4();
            break;
        case 5:
            ChipLogProgress(
                chipTool, " ***** Test Step 5 : Test Harness Client reads WiredAssessedInputFrequency attribute from Server DUT\n");
            if (ShouldSkip("PS.S.A0004")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsWiredAssessedInputFrequencyAttributeFromServerDut_5();
            break;
        case 6:
            ChipLogProgress(
                chipTool, " ***** Test Step 6 : Test Harness Client reads WiredCurrentType attribute from Server DUT\n");
            if (ShouldSkip("PS.S.A0005")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsWiredCurrentTypeAttributeFromServerDut_6();
            break;
        case 7:
            ChipLogProgress(
                chipTool, " ***** Test Step 7 : Test Harness Client reads WiredAssessedCurrent attribute from Server DUT\n");
            if (ShouldSkip("PS.S.A0006")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsWiredAssessedCurrentAttributeFromServerDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Test Harness Client reads WiredNominalVoltage from Server DUT\n");
            if (ShouldSkip("PS.S.A0007")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsWiredNominalVoltageFromServerDut_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Test Harness Client reads WiredMaximumCurrent from Server DUT\n");
            if (ShouldSkip("PS.S.A0008")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsWiredMaximumCurrentFromServerDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Test Harness Client reads WiredPresent from Server DUT\n");
            if (ShouldSkip("PS.S.A0009")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsWiredPresentFromServerDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Test Harness Client reads ActiveWiredFaults from Server DUT\n");
            if (ShouldSkip("PS.S.A000a")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsActiveWiredFaultsFromServerDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Test Harness Client reads BatVoltage from Server DUT\n");
            if (ShouldSkip("PS.S.A000b")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsBatVoltageFromServerDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Test Harness Client reads BatPercentRemaining from Server DUT\n");
            if (ShouldSkip("PS.S.A000c")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsBatPercentRemainingFromServerDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Test Harness Client reads BatTimeRemaining from Server DUT\n");
            if (ShouldSkip("PS.S.A000d")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsBatTimeRemainingFromServerDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Test Harness Client reads BatChargeLevel from Server DUT\n");
            if (ShouldSkip("PS.S.A000e")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsBatChargeLevelFromServerDut_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Test Harness Client reads BatReplacementNeeded from Server DUT\n");
            if (ShouldSkip("PS.S.A000f")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsBatReplacementNeededFromServerDut_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Test Harness Client reads BatReplaceability from Server DUT\n");
            if (ShouldSkip("PS.S.A0010")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsBatReplaceabilityFromServerDut_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Test Harness Client reads BatPresent from Server DUT\n");
            if (ShouldSkip("PS.S.A0011")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsBatPresentFromServerDut_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Test Harness Client readsActiveBatFaults from Server DUT\n");
            if (ShouldSkip("PS.S.A0012")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsActiveBatFaultsFromServerDut_19();
            break;
        case 20:
            ChipLogProgress(
                chipTool, " ***** Test Step 20 : Test Harness Client reads BatReplacementDescription from Server DUT\n");
            if (ShouldSkip("PS.S.A0013")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsBatReplacementDescriptionFromServerDut_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Test Harness Client reads BatCommonDesignation from Server DUT\n");
            if (ShouldSkip("PS.S.A0014")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsBatCommonDesignationFromServerDut_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : Test Harness Client reads BatANSIDesignation from Server DUT\n");
            if (ShouldSkip("PS.S.A0015")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsBatANSIDesignationFromServerDut_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : Test Harness Client reads BatIECDesignation from Server DUT\n");
            if (ShouldSkip("PS.S.A0016")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsBatIECDesignationFromServerDut_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : Test Harness Client reads BatApprovedChemistry from Server DUT\n");
            if (ShouldSkip("PS.S.A0017")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsBatApprovedChemistryFromServerDut_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : Test Harness Client reads BatCapacity from Server DUT\n");
            if (ShouldSkip("PS.S.A0018")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsBatCapacityFromServerDut_25();
            break;
        case 26:
            ChipLogProgress(chipTool, " ***** Test Step 26 : Test Harness Client reads BatQuantity from Server DUT\n");
            if (ShouldSkip("PS.S.A0019")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsBatQuantityFromServerDut_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : Test Harness Client reads BatChargeState from Server DUT\n");
            if (ShouldSkip("PS.S.A001a")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsBatChargeStateFromServerDut_27();
            break;
        case 28:
            ChipLogProgress(chipTool, " ***** Test Step 28 : Test Harness Client reads BatTimeToFullCharge from Server DUT\n");
            if (ShouldSkip("PS.S.A001b")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsBatTimeToFullChargeFromServerDut_28();
            break;
        case 29:
            ChipLogProgress(
                chipTool, " ***** Test Step 29 : Test Harness Client reads BatFunctionalWhileCharging from Server DUT\n");
            if (ShouldSkip("PS.S.A001c")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsBatFunctionalWhileChargingFromServerDut_29();
            break;
        case 30:
            ChipLogProgress(chipTool, " ***** Test Step 30 : Test Harness Client reads BatChargingCurrent from Server DUT\n");
            if (ShouldSkip("PS.S.A001d")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsBatChargingCurrentFromServerDut_30();
            break;
        case 31:
            ChipLogProgress(chipTool, " ***** Test Step 31 : Test Harness Client reads ActiveBatChargeFaults from Server DUT\n");
            if (ShouldSkip("PS.S.A001e")) {
                NextTest();
                return;
            }
            err = TestTestHarnessClientReadsActiveBatChargeFaultsFromServerDut_31();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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));
            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));
            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));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 32;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestTestHarnessClientReadsStatusAttributeFromServerDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads Status attribute from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("status", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("status", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("status", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsOrderAttributeFromServerDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOrderWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads Order attribute from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("order", "int8u", "int8u"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("order", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("order", [value unsignedCharValue], 255U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsDescriptionAttributeFromServerDut_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeDescriptionWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads Description attribute from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("description", "char_string", "char_string"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsWiredAssessedInputVoltageAttribueFromServerDut_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeWiredAssessedInputVoltageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads WiredAssessedInputVoltage attribue from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("wiredAssessedInputVoltage", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue<uint32_t>("wiredAssessedInputVoltage", [value unsignedIntValue], 0UL));
                VerifyOrReturn(
                    CheckConstraintMaxValue<uint32_t>("wiredAssessedInputVoltage", [value unsignedIntValue], 4294967295UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsWiredAssessedInputFrequencyAttributeFromServerDut_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeWiredAssessedInputFrequencyWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads WiredAssessedInputFrequency attribute from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("wiredAssessedInputFrequency", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("wiredAssessedInputFrequency", [value unsignedShortValue], 0U));
                VerifyOrReturn(
                    CheckConstraintMaxValue<uint16_t>("wiredAssessedInputFrequency", [value unsignedShortValue], 65535U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsWiredCurrentTypeAttributeFromServerDut_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeWiredCurrentTypeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads WiredCurrentType attribute from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("wiredCurrentType", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("wiredCurrentType", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("wiredCurrentType", [value unsignedCharValue], 1U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsWiredAssessedCurrentAttributeFromServerDut_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeWiredAssessedCurrentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads WiredAssessedCurrent attribute from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("wiredAssessedCurrent", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue<uint32_t>("wiredAssessedCurrent", [value unsignedIntValue], 0UL));
                VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("wiredAssessedCurrent", [value unsignedIntValue], 4294967295UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsWiredNominalVoltageFromServerDut_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeWiredNominalVoltageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads WiredNominalVoltage from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("wiredNominalVoltage", "int32u", "int32u"));
            VerifyOrReturn(CheckConstraintMinValue<uint32_t>("wiredNominalVoltage", [value unsignedIntValue], 0UL));
            VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("wiredNominalVoltage", [value unsignedIntValue], 4294967295UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsWiredMaximumCurrentFromServerDut_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeWiredMaximumCurrentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads WiredMaximumCurrent from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("wiredMaximumCurrent", "int32u", "int32u"));
            VerifyOrReturn(CheckConstraintMinValue<uint32_t>("wiredMaximumCurrent", [value unsignedIntValue], 0UL));
            VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("wiredMaximumCurrent", [value unsignedIntValue], 4294967295UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsWiredPresentFromServerDut_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeWiredPresentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads WiredPresent from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("wiredPresent", "boolean", "boolean"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsActiveWiredFaultsFromServerDut_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeActiveWiredFaultsWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads ActiveWiredFaults from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("activeWiredFaults", "list", "list"));
            VerifyOrReturn(CheckConstraintMaxLength("activeWiredFaults", value, 8));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsBatVoltageFromServerDut_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatVoltageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads BatVoltage from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("batVoltage", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue<uint32_t>("batVoltage", [value unsignedIntValue], 0UL));
                VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("batVoltage", [value unsignedIntValue], 4294967295UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsBatPercentRemainingFromServerDut_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatPercentRemainingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads BatPercentRemaining from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("batPercentRemaining", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("batPercentRemaining", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("batPercentRemaining", [value unsignedCharValue], 200U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsBatTimeRemainingFromServerDut_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatTimeRemainingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads BatTimeRemaining from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("batTimeRemaining", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue<uint32_t>("batTimeRemaining", [value unsignedIntValue], 0UL));
                VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("batTimeRemaining", [value unsignedIntValue], 4294967295UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsBatChargeLevelFromServerDut_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatChargeLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads BatChargeLevel from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("batChargeLevel", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("batChargeLevel", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("batChargeLevel", [value unsignedCharValue], 2U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsBatReplacementNeededFromServerDut_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatReplacementNeededWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads BatReplacementNeeded from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("batReplacementNeeded", "boolean", "boolean"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsBatReplaceabilityFromServerDut_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatReplaceabilityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads BatReplaceability from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("batReplaceability", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("batReplaceability", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("batReplaceability", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsBatPresentFromServerDut_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatPresentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads BatPresent from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("batPresent", "boolean", "boolean"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsActiveBatFaultsFromServerDut_19()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeActiveBatFaultsWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client readsActiveBatFaults from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("activeBatFaults", "list", "list"));
            VerifyOrReturn(CheckConstraintMaxLength("activeBatFaults", value, 8));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsBatReplacementDescriptionFromServerDut_20()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatReplacementDescriptionWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads BatReplacementDescription from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("batReplacementDescription", "char_string", "char_string"));
            VerifyOrReturn(CheckConstraintMaxLength("batReplacementDescription", value, 60));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsBatCommonDesignationFromServerDut_21()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatCommonDesignationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads BatCommonDesignation from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("batCommonDesignation", "int32u", "int32u"));
            VerifyOrReturn(CheckConstraintMinValue<uint32_t>("batCommonDesignation", [value unsignedIntValue], 0UL));
            VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("batCommonDesignation", [value unsignedIntValue], 80UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsBatANSIDesignationFromServerDut_22()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatANSIDesignationWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads BatANSIDesignation from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("batANSIDesignation", "char_string", "char_string"));
            VerifyOrReturn(CheckConstraintMaxLength("batANSIDesignation", value, 20));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsBatIECDesignationFromServerDut_23()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatIECDesignationWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads BatIECDesignation from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("batIECDesignation", "char_string", "char_string"));
            VerifyOrReturn(CheckConstraintMaxLength("batIECDesignation", value, 20));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsBatApprovedChemistryFromServerDut_24()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatApprovedChemistryWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads BatApprovedChemistry from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("batApprovedChemistry", "int32u", "int32u"));
            VerifyOrReturn(CheckConstraintMinValue<uint32_t>("batApprovedChemistry", [value unsignedIntValue], 0UL));
            VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("batApprovedChemistry", [value unsignedIntValue], 32UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsBatCapacityFromServerDut_25()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatCapacityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads BatCapacity from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("batCapacity", "int32u", "int32u"));
            VerifyOrReturn(CheckConstraintMinValue<uint32_t>("batCapacity", [value unsignedIntValue], 0UL));
            VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("batCapacity", [value unsignedIntValue], 4294967295UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsBatQuantityFromServerDut_26()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatQuantityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads BatQuantity from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("batQuantity", "int8u", "int8u"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("batQuantity", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("batQuantity", [value unsignedCharValue], 255U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsBatChargeStateFromServerDut_27()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatChargeStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads BatChargeState from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("batChargeState", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("batChargeState", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("batChargeState", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsBatTimeToFullChargeFromServerDut_28()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatTimeToFullChargeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads BatTimeToFullCharge from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("batTimeToFullCharge", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue<uint32_t>("batTimeToFullCharge", [value unsignedIntValue], 0UL));
                VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("batTimeToFullCharge", [value unsignedIntValue], 4294967295UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsBatFunctionalWhileChargingFromServerDut_29()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatFunctionalWhileChargingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads BatFunctionalWhileCharging from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("batFunctionalWhileCharging", "boolean", "boolean"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsBatChargingCurrentFromServerDut_30()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatChargingCurrentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads BatChargingCurrent from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("batChargingCurrent", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue<uint32_t>("batChargingCurrent", [value unsignedIntValue], 0UL));
                VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("batChargingCurrent", [value unsignedIntValue], 4294967295UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTestHarnessClientReadsActiveBatChargeFaultsFromServerDut_31()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeActiveBatChargeFaultsWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Test Harness Client reads ActiveBatChargeFaults from Server DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("activeBatChargeFaults", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_PRS_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_PRS_1_1()
        : TestCommandBridge("Test_TC_PRS_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_PRS_1_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_PRS_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_PRS_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            if (ShouldSkip(" !PRS.S.F00 ")) {
                NextTest();
                return;
            }
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Given PRS.S.F00(EXT) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("PRS.S.F00")) {
                NextTest();
                return;
            }
            err = TestGivenPrssf00extEnsureFeaturemapHasTheCorrectBitSet_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the global mandatory attribute: AttributeList\n");
            err = TestReadTheGlobalMandatoryAttributeAttributeList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the optional attribute(ScaledValue) in AttributeList\n");
            if (ShouldSkip("PRS.S.A0010")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeScaledValueInAttributeList_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read the optional attribute(MinScaledValue) in AttributeList\n");
            if (ShouldSkip("PRS.S.A0011")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeMinScaledValueInAttributeList_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read the optional attribute(MaxScaledValue) in AttributeList\n");
            if (ShouldSkip("PRS.S.A0012")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeMaxScaledValueInAttributeList_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read the optional attribute(Scale) in AttributeList\n");
            if (ShouldSkip("PRS.S.A0014")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeScaleInAttributeList_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Read the optional attribute(Tolerance) in AttributeList\n");
            if (ShouldSkip("PRS.S.A0003")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeToleranceInAttributeList_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Read the optional attribute(ScaledTolerance) in AttributeList\n");
            if (ShouldSkip("PRS.S.A0013")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeScaledToleranceInAttributeList_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_12();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 13;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 3U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenPrssf00extEnsureFeaturemapHasTheCorrectBitSet_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given PRS.S.F00(EXT) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalMandatoryAttributeAttributeList_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global mandatory attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeScaledValueInAttributeList_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(ScaledValue) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 16UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeMinScaledValueInAttributeList_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(MinScaledValue) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 17UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeMaxScaledValueInAttributeList_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(MaxScaledValue) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 18UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeScaleInAttributeList_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(Scale) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 20UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeToleranceInAttributeList_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(Tolerance) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeScaledToleranceInAttributeList_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(ScaledTolerance) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 19UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_PRS_2_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_PRS_2_1()
        : TestCommandBridge("Test_TC_PRS_2_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_PRS_2_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_PRS_2_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_PRS_2_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read the mandatory attribute constraints: MeasuredValue\n");
            if (ShouldSkip("PRS.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadTheMandatoryAttributeConstraintsMeasuredValue_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the mandatory attribute constraints: MinMeasuredValue\n");
            if (ShouldSkip("PRS.S.A0001")) {
                NextTest();
                return;
            }
            err = TestReadTheMandatoryAttributeConstraintsMinMeasuredValue_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the mandatory attribute constraints: MaxMeasuredValue\n");
            if (ShouldSkip("PRS.S.A0002")) {
                NextTest();
                return;
            }
            err = TestReadTheMandatoryAttributeConstraintsMaxMeasuredValue_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the optional attribute: Tolerance\n");
            if (ShouldSkip("PRS.S.A0003")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeTolerance_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the optional attribute: ScaledValue\n");
            if (ShouldSkip("PRS.S.A0010")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeScaledValue_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read the optional attribute: MinScaledValue\n");
            if (ShouldSkip("PRS.S.A0011")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeMinScaledValue_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read the optional attribute: MaxScaledValue\n");
            if (ShouldSkip("PRS.S.A0012")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeMaxScaledValue_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read the optional attribute: ScaledTolerance\n");
            if (ShouldSkip("PRS.S.A0013")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeScaledTolerance_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Read the optional attribute: Scale\n");
            if (ShouldSkip("PRS.S.A0014")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeScale_9();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 10;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheMandatoryAttributeConstraintsMeasuredValue_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the mandatory attribute constraints: MeasuredValue Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("measuredValue", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue<int16_t>("measuredValue", [value shortValue], -32768));
                VerifyOrReturn(CheckConstraintMaxValue<int16_t>("measuredValue", [value shortValue], 32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheMandatoryAttributeConstraintsMinMeasuredValue_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the mandatory attribute constraints: MinMeasuredValue Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("minMeasuredValue", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue<int16_t>("minMeasuredValue", [value shortValue], -32768));
                VerifyOrReturn(CheckConstraintMaxValue<int16_t>("minMeasuredValue", [value shortValue], 32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheMandatoryAttributeConstraintsMaxMeasuredValue_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the mandatory attribute constraints: MaxMeasuredValue Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("maxMeasuredValue", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue<int16_t>("maxMeasuredValue", [value shortValue], -32768));
                VerifyOrReturn(CheckConstraintMaxValue<int16_t>("maxMeasuredValue", [value shortValue], 32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeTolerance_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeToleranceWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute: Tolerance Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("tolerance", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("tolerance", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("tolerance", [value unsignedShortValue], 2048U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeScaledValue_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeScaledValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute: ScaledValue Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("scaledValue", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue<int16_t>("scaledValue", [value shortValue], -32768));
                VerifyOrReturn(CheckConstraintMaxValue<int16_t>("scaledValue", [value shortValue], 32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeMinScaledValue_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinScaledValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute: MinScaledValue Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("minScaledValue", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue<int16_t>("minScaledValue", [value shortValue], -32768));
                VerifyOrReturn(CheckConstraintMaxValue<int16_t>("minScaledValue", [value shortValue], 32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeMaxScaledValue_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxScaledValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute: MaxScaledValue Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("maxScaledValue", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue<int16_t>("maxScaledValue", [value shortValue], -32768));
                VerifyOrReturn(CheckConstraintMaxValue<int16_t>("maxScaledValue", [value shortValue], 32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeScaledTolerance_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeScaledToleranceWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute: ScaledTolerance Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("scaledTolerance", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("scaledTolerance", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("scaledTolerance", [value unsignedShortValue], 2048U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeScale_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeScaleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute: Scale Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("scale", "int8s", "int8s"));
            VerifyOrReturn(CheckConstraintMinValue<int8_t>("scale", [value charValue], -127));
            VerifyOrReturn(CheckConstraintMaxValue<int8_t>("scale", [value charValue], 127));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_PRS_2_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_PRS_2_2()
        : TestCommandBridge("Test_TC_PRS_2_2")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_PRS_2_2() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_PRS_2_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_PRS_2_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads from the DUT the MeasuredValue attribute\n");
            if (ShouldSkip("PRS.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsFromTheDutTheMeasuredValueAttribute_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Operate on device to change the pressure significantly\n");
            if (ShouldSkip("PICS_USER_PROMPT && PRS.M.PressureChange")) {
                NextTest();
                return;
            }
            err = TestOperateOnDeviceToChangeThePressureSignificantly_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Wait 2s\n");
            err = TestWait2s_3();
            break;
        case 4:
            ChipLogProgress(
                chipTool, " ***** Test Step 4 : After a few seconds, TH reads from the DUT the MeasuredValue attribute\n");
            if (ShouldSkip("PRS.S.A0000 && PRS.M.PressureChange")) {
                NextTest();
                return;
            }
            err = TestAfterAFewSecondsThReadsFromTheDutTheMeasuredValueAttribute_4();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 5;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }
    NSNumber * _Nullable ValueBeforeChange;

    CHIP_ERROR TestThReadsFromTheDutTheMeasuredValueAttribute_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads from the DUT the MeasuredValue attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                ValueBeforeChange = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestOperateOnDeviceToChangeThePressureSignificantly_2()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestWait2s_3()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 2000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestAfterAFewSecondsThReadsFromTheDutTheMeasuredValueAttribute_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"After a few seconds, TH reads from the DUT the MeasuredValue attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckConstraintNotValue("measuredValue", value, ValueBeforeChange));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_PCC_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_PCC_1_1()
        : TestCommandBridge("Test_TC_PCC_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_PCC_1_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_PCC_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_PCC_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads the ClusterRevision attribute from the DUT\n");
            err = TestThReadsTheClusterRevisionAttributeFromTheDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads the FeatureMap attribute from the DUT\n");
            if (ShouldSkip(" !PCC.S.F00 && !PCC.S.F01 && !PCC.S.F02 && !PCC.S.F03 && !PCC.S.F04 && !PCC.S.F05 && !PCC.S.F06 ")) {
                NextTest();
                return;
            }
            err = TestThReadsTheFeatureMapAttributeFromTheDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Given PCC.S.F00(PRSCONST) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("PCC.S.F00")) {
                NextTest();
                return;
            }
            err = TestGivenPccsf00prsconstEnsureFeaturemapHasTheCorrectBitSet_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Given PCC.S.F01(PRSCOMP) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("PCC.S.F01")) {
                NextTest();
                return;
            }
            err = TestGivenPccsf01prscompEnsureFeaturemapHasTheCorrectBitSet_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Given PCC.S.F02(FLW) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("PCC.S.F02")) {
                NextTest();
                return;
            }
            err = TestGivenPccsf02flwEnsureFeaturemapHasTheCorrectBitSet_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Given PCC.S.F03(SPD) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("PCC.S.F03")) {
                NextTest();
                return;
            }
            err = TestGivenPccsf03spdEnsureFeaturemapHasTheCorrectBitSet_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Given PCC.S.F04(TEMP) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("PCC.S.F04")) {
                NextTest();
                return;
            }
            err = TestGivenPccsf04tempEnsureFeaturemapHasTheCorrectBitSet_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Given PCC.S.F05(AUTO) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("PCC.S.F05")) {
                NextTest();
                return;
            }
            err = TestGivenPccsf05autoEnsureFeaturemapHasTheCorrectBitSet_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Given PCC.S.F06(LOCAL) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("PCC.S.F06")) {
                NextTest();
                return;
            }
            err = TestGivenPccsf06localEnsureFeaturemapHasTheCorrectBitSet_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : TH reads the AttributeList attribute from the DUT\n");
            err = TestThReadsTheAttributeListAttributeFromTheDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool,
                " ***** Test Step 11 : TH reads optional attribute(MinConstPressure) attribute in AttributeList from the DUT\n");
            if (ShouldSkip("PCC.S.A0003")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeMinConstPressureAttributeInAttributeListFromTheDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool,
                " ***** Test Step 12 : TH reads optional attribute(MaxConstPressure) attribute in AttributeList from the DUT\n");
            if (ShouldSkip("PCC.S.A0004")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeMaxConstPressureAttributeInAttributeListFromTheDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool,
                " ***** Test Step 13 : TH reads optional attribute(MinCompPressure) attribute in AttributeList from the DUT\n");
            if (ShouldSkip("PCC.S.A0005")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeMinCompPressureAttributeInAttributeListFromTheDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool,
                " ***** Test Step 14 : TH reads optional attribute(MaxCompPressure) attribute in AttributeList from the DUT\n");
            if (ShouldSkip("PCC.S.A0006")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeMaxCompPressureAttributeInAttributeListFromTheDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool,
                " ***** Test Step 15 : TH reads optional attribute(MinConstSpeed) attribute in AttributeList from the DUT\n");
            if (ShouldSkip("PCC.S.A0007")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeMinConstSpeedAttributeInAttributeListFromTheDut_15();
            break;
        case 16:
            ChipLogProgress(chipTool,
                " ***** Test Step 16 : TH reads optional attribute(MaxConstSpeed) attribute in AttributeList from the DUT\n");
            if (ShouldSkip("PCC.S.A0008")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeMaxConstSpeedAttributeInAttributeListFromTheDut_16();
            break;
        case 17:
            ChipLogProgress(chipTool,
                " ***** Test Step 17 : TH reads optional attribute(MinConstFlow) attribute in AttributeList from the DUT\n");
            if (ShouldSkip("PCC.S.A0009")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeMinConstFlowAttributeInAttributeListFromTheDut_17();
            break;
        case 18:
            ChipLogProgress(chipTool,
                " ***** Test Step 18 : TH reads optional attribute(MaxConstFlow) attribute in AttributeList from the DUT\n");
            if (ShouldSkip("PCC.S.A000a")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeMaxConstFlowAttributeInAttributeListFromTheDut_18();
            break;
        case 19:
            ChipLogProgress(chipTool,
                " ***** Test Step 19 : TH reads optional attribute(MinConstTemp) attribute in AttributeList from the DUT\n");
            if (ShouldSkip("PCC.S.A000b")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeMinConstTempAttributeInAttributeListFromTheDut_19();
            break;
        case 20:
            ChipLogProgress(chipTool,
                " ***** Test Step 20 : TH reads optional attribute(MaxConstTemp) attribute in AttributeList from the DUT\n");
            if (ShouldSkip("PCC.S.A000c")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeMaxConstTempAttributeInAttributeListFromTheDut_20();
            break;
        case 21:
            ChipLogProgress(chipTool,
                " ***** Test Step 21 : TH reads optional attribute(PumpStatus) attribute in AttributeList from the DUT\n");
            if (ShouldSkip("PCC.S.A0010")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributePumpStatusAttributeInAttributeListFromTheDut_21();
            break;
        case 22:
            ChipLogProgress(
                chipTool, " ***** Test Step 22 : TH reads optional attribute(Speed) attribute in AttributeList from the DUT\n");
            if (ShouldSkip("PCC.S.A0014")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeSpeedAttributeInAttributeListFromTheDut_22();
            break;
        case 23:
            ChipLogProgress(chipTool,
                " ***** Test Step 23 : TH reads optional attribute(LifetimeRunningHours) attribute in AttributeList from the "
                "DUT\n");
            if (ShouldSkip("PCC.S.A0015")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeLifetimeRunningHoursAttributeInAttributeListFromTheDut_23();
            break;
        case 24:
            ChipLogProgress(
                chipTool, " ***** Test Step 24 : TH reads optional attribute(Power) attribute in AttributeList from the DUT\n");
            if (ShouldSkip("PCC.S.A0016")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributePowerAttributeInAttributeListFromTheDut_24();
            break;
        case 25:
            ChipLogProgress(chipTool,
                " ***** Test Step 25 : TH reads optional attribute(LifetimeEnergyConsumed) attribute in AttributeList from the "
                "DUT\n");
            if (ShouldSkip("PCC.S.A0017")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeLifetimeEnergyConsumedAttributeInAttributeListFromTheDut_25();
            break;
        case 26:
            ChipLogProgress(chipTool,
                " ***** Test Step 26 : TH reads optional attribute(ControlMode) attribute in AttributeList from the DUT\n");
            if (ShouldSkip("PCC.S.A0021")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeControlModeAttributeInAttributeListFromTheDut_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : TH reads the AcceptedCommandList attribute from the DUT\n");
            err = TestThReadsTheAcceptedCommandListAttributeFromTheDut_27();
            break;
        case 28:
            ChipLogProgress(chipTool, " ***** Test Step 28 : TH reads the GeneratedCommandList attribute from the DUT\n");
            err = TestThReadsTheGeneratedCommandListAttributeFromTheDut_28();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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));
            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));
            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));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 29;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheClusterRevisionAttributeFromTheDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the ClusterRevision attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 4U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheFeatureMapAttributeFromTheDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the FeatureMap attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenPccsf00prsconstEnsureFeaturemapHasTheCorrectBitSet_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given PCC.S.F00(PRSCONST) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenPccsf01prscompEnsureFeaturemapHasTheCorrectBitSet_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given PCC.S.F01(PRSCOMP) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenPccsf02flwEnsureFeaturemapHasTheCorrectBitSet_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given PCC.S.F02(FLW) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenPccsf03spdEnsureFeaturemapHasTheCorrectBitSet_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given PCC.S.F03(SPD) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenPccsf04tempEnsureFeaturemapHasTheCorrectBitSet_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given PCC.S.F04(TEMP) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenPccsf05autoEnsureFeaturemapHasTheCorrectBitSet_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given PCC.S.F05(AUTO) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenPccsf06localEnsureFeaturemapHasTheCorrectBitSet_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given PCC.S.F06(LOCAL) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheAttributeListAttributeFromTheDut_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the AttributeList attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 17UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 18UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 19UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 32UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeMinConstPressureAttributeInAttributeListFromTheDut_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(MinConstPressure) attribute in AttributeList from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeMaxConstPressureAttributeInAttributeListFromTheDut_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(MaxConstPressure) attribute in AttributeList from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 4UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeMinCompPressureAttributeInAttributeListFromTheDut_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(MinCompPressure) attribute in AttributeList from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 5UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeMaxCompPressureAttributeInAttributeListFromTheDut_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(MaxCompPressure) attribute in AttributeList from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 6UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeMinConstSpeedAttributeInAttributeListFromTheDut_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(MinConstSpeed) attribute in AttributeList from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 7UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeMaxConstSpeedAttributeInAttributeListFromTheDut_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(MaxConstSpeed) attribute in AttributeList from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 8UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeMinConstFlowAttributeInAttributeListFromTheDut_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(MinConstFlow) attribute in AttributeList from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 9UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeMaxConstFlowAttributeInAttributeListFromTheDut_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(MaxConstFlow) attribute in AttributeList from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 10UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeMinConstTempAttributeInAttributeListFromTheDut_19()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(MinConstTemp) attribute in AttributeList from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 11UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeMaxConstTempAttributeInAttributeListFromTheDut_20()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(MaxConstTemp) attribute in AttributeList from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 12UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributePumpStatusAttributeInAttributeListFromTheDut_21()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(PumpStatus) attribute in AttributeList from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 16UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeSpeedAttributeInAttributeListFromTheDut_22()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(Speed) attribute in AttributeList from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 20UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeLifetimeRunningHoursAttributeInAttributeListFromTheDut_23()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(LifetimeRunningHours) attribute in AttributeList from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 21UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributePowerAttributeInAttributeListFromTheDut_24()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(Power) attribute in AttributeList from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 22UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeLifetimeEnergyConsumedAttributeInAttributeListFromTheDut_25()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(LifetimeEnergyConsumed) attribute in AttributeList from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 23UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeControlModeAttributeInAttributeListFromTheDut_26()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(ControlMode) attribute in AttributeList from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 33UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheAcceptedCommandListAttributeFromTheDut_27()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the AcceptedCommandList attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheGeneratedCommandListAttributeFromTheDut_28()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the GeneratedCommandList attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_PCC_2_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_PCC_2_1()
        : TestCommandBridge("Test_TC_PCC_2_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_PCC_2_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_PCC_2_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_PCC_2_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read the mandatory attribute: MaxPressure\n");
            if (ShouldSkip("PCC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadTheMandatoryAttributeMaxPressure_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the mandatory attribute: MaxSpeed\n");
            if (ShouldSkip("PCC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestReadTheMandatoryAttributeMaxSpeed_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the mandatory attribute: MaxFlow\n");
            if (ShouldSkip("PCC.S.A0002")) {
                NextTest();
                return;
            }
            err = TestReadTheMandatoryAttributeMaxFlow_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the optional attribute: MinConstPressure\n");
            if (ShouldSkip("PCC.S.A0003")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeMinConstPressure_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the optional attribute: MaxConstPressure\n");
            if (ShouldSkip("PCC.S.A0004")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeMaxConstPressure_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read the optional attribute: MinCompPressure\n");
            if (ShouldSkip("PCC.S.A0005")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeMinCompPressure_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read the optional attribute: MaxCompPressure\n");
            if (ShouldSkip("PCC.S.A0006")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeMaxCompPressure_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read the optional attribute: MinConstSpeed\n");
            if (ShouldSkip("PCC.S.A0007")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeMinConstSpeed_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Read the optional attribute: MaxConstSpeed\n");
            if (ShouldSkip("PCC.S.A0008")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeMaxConstSpeed_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Read the optional attribute: MinConstFlow\n");
            if (ShouldSkip("PCC.S.A0009")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeMinConstFlow_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Read the optional attribute: MaxConstFlow\n");
            if (ShouldSkip("PCC.S.A000a")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeMaxConstFlow_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Read the optional attribute: MinConstTemp\n");
            if (ShouldSkip("PCC.S.A000b")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeMinConstTemp_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Read the optional attribute: MaxConstTemp\n");
            if (ShouldSkip("PCC.S.A000c")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeMaxConstTemp_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Read the optional attribute: PumpStatus\n");
            if (ShouldSkip("PCC.S.A0010")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributePumpStatus_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Read attribute: EffectiveOperationMode\n");
            if (ShouldSkip("PCC.S.A0011")) {
                NextTest();
                return;
            }
            err = TestReadAttributeEffectiveOperationMode_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Read attribute: EffectiveControlMode\n");
            if (ShouldSkip("PCC.S.A0012")) {
                NextTest();
                return;
            }
            err = TestReadAttributeEffectiveControlMode_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Read attribute: Capacity\n");
            if (ShouldSkip("PCC.S.A0013")) {
                NextTest();
                return;
            }
            err = TestReadAttributeCapacity_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Read the optional attribute: Speed\n");
            if (ShouldSkip("PCC.S.A0014")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeSpeed_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Read the optional attribute: LifetimeRunningHours\n");
            if (ShouldSkip("PCC.S.A0015")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeLifetimeRunningHours_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Read the optional attribute: Power\n");
            if (ShouldSkip("PCC.S.A0016")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributePower_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Read the optional attribute: LifetimeEnergyConsumed\n");
            if (ShouldSkip("PCC.S.A0017")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeLifetimeEnergyConsumed_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : Read optional attribute: OperationMode\n");
            if (ShouldSkip("PCC.S.A0020")) {
                NextTest();
                return;
            }
            err = TestReadOptionalAttributeOperationMode_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : Read optional attribute: ControlMode\n");
            if (ShouldSkip("PCC.S.A0021")) {
                NextTest();
                return;
            }
            err = TestReadOptionalAttributeControlMode_23();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 24;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheMandatoryAttributeMaxPressure_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxPressureWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the mandatory attribute: MaxPressure Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("maxPressure", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue<int16_t>("maxPressure", [value shortValue], -32768));
                VerifyOrReturn(CheckConstraintMaxValue<int16_t>("maxPressure", [value shortValue], 32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheMandatoryAttributeMaxSpeed_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxSpeedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the mandatory attribute: MaxSpeed Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("maxSpeed", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("maxSpeed", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("maxSpeed", [value unsignedShortValue], 65535U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheMandatoryAttributeMaxFlow_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxFlowWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the mandatory attribute: MaxFlow Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("maxFlow", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("maxFlow", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("maxFlow", [value unsignedShortValue], 65535U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeMinConstPressure_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinConstPressureWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute: MinConstPressure Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("minConstPressure", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue<int16_t>("minConstPressure", [value shortValue], -32768));
                VerifyOrReturn(CheckConstraintMaxValue<int16_t>("minConstPressure", [value shortValue], 32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeMaxConstPressure_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxConstPressureWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute: MaxConstPressure Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("maxConstPressure", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue<int16_t>("maxConstPressure", [value shortValue], -32768));
                VerifyOrReturn(CheckConstraintMaxValue<int16_t>("maxConstPressure", [value shortValue], 32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeMinCompPressure_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinCompPressureWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute: MinCompPressure Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("minCompPressure", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue<int16_t>("minCompPressure", [value shortValue], -32768));
                VerifyOrReturn(CheckConstraintMaxValue<int16_t>("minCompPressure", [value shortValue], 32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeMaxCompPressure_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxCompPressureWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute: MaxCompPressure Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("maxCompPressure", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue<int16_t>("maxCompPressure", [value shortValue], -32768));
                VerifyOrReturn(CheckConstraintMaxValue<int16_t>("maxCompPressure", [value shortValue], 32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeMinConstSpeed_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinConstSpeedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute: MinConstSpeed Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("minConstSpeed", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("minConstSpeed", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("minConstSpeed", [value unsignedShortValue], 65535U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeMaxConstSpeed_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxConstSpeedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute: MaxConstSpeed Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("maxConstSpeed", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("maxConstSpeed", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("maxConstSpeed", [value unsignedShortValue], 65535U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeMinConstFlow_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinConstFlowWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute: MinConstFlow Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("minConstFlow", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("minConstFlow", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("minConstFlow", [value unsignedShortValue], 65535U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeMaxConstFlow_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxConstFlowWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute: MaxConstFlow Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("maxConstFlow", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("maxConstFlow", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("maxConstFlow", [value unsignedShortValue], 65535U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeMinConstTemp_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinConstTempWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute: MinConstTemp Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("minConstTemp", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue<int16_t>("minConstTemp", [value shortValue], -32768));
                VerifyOrReturn(CheckConstraintMaxValue<int16_t>("minConstTemp", [value shortValue], 32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeMaxConstTemp_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxConstTempWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute: MaxConstTemp Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("maxConstTemp", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue<int16_t>("maxConstTemp", [value shortValue], -32768));
                VerifyOrReturn(CheckConstraintMaxValue<int16_t>("maxConstTemp", [value shortValue], 32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributePumpStatus_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePumpStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute: PumpStatus Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("pumpStatus", "bitmap16", "bitmap16"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("pumpStatus", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("pumpStatus", [value unsignedShortValue], 8U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeEffectiveOperationMode_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEffectiveOperationModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute: EffectiveOperationMode Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("effectiveOperationMode", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("effectiveOperationMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("effectiveOperationMode", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeEffectiveControlMode_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEffectiveControlModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute: EffectiveControlMode Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("effectiveControlMode", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("effectiveControlMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("effectiveControlMode", [value unsignedCharValue], 7U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeCapacity_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCapacityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute: Capacity Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("capacity", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue<int16_t>("capacity", [value shortValue], -32768));
                VerifyOrReturn(CheckConstraintMaxValue<int16_t>("capacity", [value shortValue], 32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeSpeed_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSpeedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute: Speed Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("speed", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("speed", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("speed", [value unsignedShortValue], 65535U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeLifetimeRunningHours_19()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLifetimeRunningHoursWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute: LifetimeRunningHours Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("lifetimeRunningHours", "int24u", "int24u"));
                VerifyOrReturn(CheckConstraintMinValue<uint32_t>("lifetimeRunningHours", [value unsignedIntValue], 0UL));
                VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("lifetimeRunningHours", [value unsignedIntValue], 16777215UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributePower_20()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePowerWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute: Power Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("power", "int24u", "int24u"));
                VerifyOrReturn(CheckConstraintMinValue<uint32_t>("power", [value unsignedIntValue], 0UL));
                VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("power", [value unsignedIntValue], 16777215UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeLifetimeEnergyConsumed_21()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLifetimeEnergyConsumedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute: LifetimeEnergyConsumed Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("lifetimeEnergyConsumed", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue<uint32_t>("lifetimeEnergyConsumed", [value unsignedIntValue], 0UL));
                VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("lifetimeEnergyConsumed", [value unsignedIntValue], 4294967295UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadOptionalAttributeOperationMode_22()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read optional attribute: OperationMode Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("operationMode", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("operationMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("operationMode", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadOptionalAttributeControlMode_23()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeControlModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read optional attribute: ControlMode Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("controlMode", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("controlMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("controlMode", [value unsignedCharValue], 7U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_PCC_2_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_PCC_2_2()
        : TestCommandBridge("Test_TC_PCC_2_2")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_PCC_2_2() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_PCC_2_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_PCC_2_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH write 0 (Normal) to the OperationMode attribute to DUT\n");
            if (ShouldSkip("PCC.S.A0020")) {
                NextTest();
                return;
            }
            err = TestThWrite0NormalToTheOperationModeAttributeToDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads from the DUT the EffectiveOperationMode attribute\n");
            if (ShouldSkip("PCC.S.A0011")) {
                NextTest();
                return;
            }
            err = TestThReadsFromTheDutTheEffectiveOperationModeAttribute_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : TH write 1 (Minimum) to the OperationMode attribute to DUT\n");
            if (ShouldSkip("PCC.S.F03 && PCC.S.A0020")) {
                NextTest();
                return;
            }
            err = TestThWrite1MinimumToTheOperationModeAttributeToDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH reads from the DUT the EffectiveOperationMode attribute\n");
            if (ShouldSkip("PCC.S.F03 && PCC.S.A0011")) {
                NextTest();
                return;
            }
            err = TestThReadsFromTheDutTheEffectiveOperationModeAttribute_4();
            break;
        case 5:
            ChipLogProgress(
                chipTool, " ***** Test Step 5 : TH write 2 (Maximum) to the OperationMode attribute to DUT one at a time.\n");
            if (ShouldSkip("PCC.S.F03 && PCC.S.A0020")) {
                NextTest();
                return;
            }
            err = TestThWrite2MaximumToTheOperationModeAttributeToDutOneAtATime_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : TH reads from the DUT the EffectiveOperationMode attribute\n");
            if (ShouldSkip("PCC.S.F03 && PCC.S.A0011")) {
                NextTest();
                return;
            }
            err = TestThReadsFromTheDutTheEffectiveOperationModeAttribute_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH write 3 (Local) to the OperationMode attribute to DUT\n");
            if (ShouldSkip("PCC.S.F06 && PCC.S.A0020")) {
                NextTest();
                return;
            }
            err = TestThWrite3LocalToTheOperationModeAttributeToDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : TH reads from the DUT the EffectiveOperationMode attribute\n");
            if (ShouldSkip("PCC.S.F06 && PCC.S.A0011")) {
                NextTest();
                return;
            }
            err = TestThReadsFromTheDutTheEffectiveOperationModeAttribute_8();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 9;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThWrite0NormalToTheOperationModeAttributeToDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id operationModeArgument;
        operationModeArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOperationModeWithValue:operationModeArgument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"TH write 0 (Normal) to the OperationMode attribute to DUT Error: %@", err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFromTheDutTheEffectiveOperationModeAttribute_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEffectiveOperationModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads from the DUT the EffectiveOperationMode attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("EffectiveOperationMode", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWrite1MinimumToTheOperationModeAttributeToDut_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id operationModeArgument;
        operationModeArgument = [NSNumber numberWithUnsignedChar:1U];
        [cluster writeAttributeOperationModeWithValue:operationModeArgument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"TH write 1 (Minimum) to the OperationMode attribute to DUT Error: %@", err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFromTheDutTheEffectiveOperationModeAttribute_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEffectiveOperationModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads from the DUT the EffectiveOperationMode attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("EffectiveOperationMode", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWrite2MaximumToTheOperationModeAttributeToDutOneAtATime_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id operationModeArgument;
        operationModeArgument = [NSNumber numberWithUnsignedChar:2U];
        [cluster writeAttributeOperationModeWithValue:operationModeArgument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"TH write 2 (Maximum) to the OperationMode attribute to DUT one at a time. "
                                                     @"Error: %@",
                                                   err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFromTheDutTheEffectiveOperationModeAttribute_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEffectiveOperationModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads from the DUT the EffectiveOperationMode attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("EffectiveOperationMode", actualValue, 2U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWrite3LocalToTheOperationModeAttributeToDut_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id operationModeArgument;
        operationModeArgument = [NSNumber numberWithUnsignedChar:3U];
        [cluster writeAttributeOperationModeWithValue:operationModeArgument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"TH write 3 (Local) to the OperationMode attribute to DUT Error: %@", err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFromTheDutTheEffectiveOperationModeAttribute_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEffectiveOperationModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads from the DUT the EffectiveOperationMode attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("EffectiveOperationMode", actualValue, 3U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_PCC_2_3 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_PCC_2_3()
        : TestCommandBridge("Test_TC_PCC_2_3")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_PCC_2_3() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_PCC_2_3\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_PCC_2_3\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Write 0 to the OperationMode attribute to DUT\n");
            if (ShouldSkip("PCC.S.A0020")) {
                NextTest();
                return;
            }
            err = TestWrite0ToTheOperationModeAttributeToDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Reads the attribute: EffectiveOperationMode\n");
            if (ShouldSkip("PCC.S.A0011")) {
                NextTest();
                return;
            }
            err = TestReadsTheAttributeEffectiveOperationMode_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Write 0 to the ControlMode attribute to DUT\n");
            if (ShouldSkip("PCC.S.F03 && PCC.S.A0021")) {
                NextTest();
                return;
            }
            err = TestWrite0ToTheControlModeAttributeToDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Reads the attribute: EffectiveControlMode\n");
            if (ShouldSkip("PCC.S.F03 && PCC.S.A0012")) {
                NextTest();
                return;
            }
            err = TestReadsTheAttributeEffectiveControlMode_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Write 1 to the ControlMode attribute to DUT\n");
            if (ShouldSkip("PCC.S.F00 && PCC.S.A0021")) {
                NextTest();
                return;
            }
            err = TestWrite1ToTheControlModeAttributeToDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Reads the attribute: EffectiveControlMode\n");
            if (ShouldSkip("PCC.S.F00 && PCC.S.A0012")) {
                NextTest();
                return;
            }
            err = TestReadsTheAttributeEffectiveControlMode_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Write 2 to the ControlMode attribute to DUT\n");
            if (ShouldSkip("PCC.S.F01 && PCC.S.A0021")) {
                NextTest();
                return;
            }
            err = TestWrite2ToTheControlModeAttributeToDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Reads the attribute: EffectiveControlMode\n");
            if (ShouldSkip("PCC.S.F01 && PCC.S.A0012")) {
                NextTest();
                return;
            }
            err = TestReadsTheAttributeEffectiveControlMode_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Write 3 to the ControlMode attribute to DUT\n");
            if (ShouldSkip("PCC.S.F02 && PCC.S.A0021")) {
                NextTest();
                return;
            }
            err = TestWrite3ToTheControlModeAttributeToDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Reads the attribute: EffectiveControlMode\n");
            if (ShouldSkip("PCC.S.F02 && PCC.S.A0012")) {
                NextTest();
                return;
            }
            err = TestReadsTheAttributeEffectiveControlMode_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Write 5 to the ControlMode attribute to DUT\n");
            if (ShouldSkip("PCC.S.F04 && PCC.S.A0021")) {
                NextTest();
                return;
            }
            err = TestWrite5ToTheControlModeAttributeToDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Reads the attribute: EffectiveControlMode\n");
            if (ShouldSkip("PCC.S.F04 && PCC.S.A0012")) {
                NextTest();
                return;
            }
            err = TestReadsTheAttributeEffectiveControlMode_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Write 7 to the ControlMode attribute to DUT\n");
            if (ShouldSkip("PCC.S.F05 && PCC.S.A0021")) {
                NextTest();
                return;
            }
            err = TestWrite7ToTheControlModeAttributeToDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Reads the attribute: EffectiveControlMode\n");
            if (ShouldSkip("PCC.S.F02 && PCC.S.A0012")) {
                NextTest();
                return;
            }
            err = TestReadsTheAttributeEffectiveControlMode_14();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 15;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestWrite0ToTheOperationModeAttributeToDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id operationModeArgument;
        operationModeArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOperationModeWithValue:operationModeArgument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"Write 0 to the OperationMode attribute to DUT Error: %@", err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheAttributeEffectiveOperationMode_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEffectiveOperationModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the attribute: EffectiveOperationMode Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("EffectiveOperationMode", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWrite0ToTheControlModeAttributeToDut_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id controlModeArgument;
        controlModeArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeControlModeWithValue:controlModeArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write 0 to the ControlMode attribute to DUT Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheAttributeEffectiveControlMode_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEffectiveControlModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the attribute: EffectiveControlMode Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("EffectiveControlMode", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWrite1ToTheControlModeAttributeToDut_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id controlModeArgument;
        controlModeArgument = [NSNumber numberWithUnsignedChar:1U];
        [cluster writeAttributeControlModeWithValue:controlModeArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write 1 to the ControlMode attribute to DUT Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheAttributeEffectiveControlMode_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEffectiveControlModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the attribute: EffectiveControlMode Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("EffectiveControlMode", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWrite2ToTheControlModeAttributeToDut_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id controlModeArgument;
        controlModeArgument = [NSNumber numberWithUnsignedChar:2U];
        [cluster writeAttributeControlModeWithValue:controlModeArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write 2 to the ControlMode attribute to DUT Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheAttributeEffectiveControlMode_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEffectiveControlModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the attribute: EffectiveControlMode Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("EffectiveControlMode", actualValue, 2U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWrite3ToTheControlModeAttributeToDut_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id controlModeArgument;
        controlModeArgument = [NSNumber numberWithUnsignedChar:3U];
        [cluster writeAttributeControlModeWithValue:controlModeArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write 3 to the ControlMode attribute to DUT Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheAttributeEffectiveControlMode_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEffectiveControlModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the attribute: EffectiveControlMode Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("EffectiveControlMode", actualValue, 3U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWrite5ToTheControlModeAttributeToDut_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id controlModeArgument;
        controlModeArgument = [NSNumber numberWithUnsignedChar:5U];
        [cluster writeAttributeControlModeWithValue:controlModeArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write 5 to the ControlMode attribute to DUT Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheAttributeEffectiveControlMode_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEffectiveControlModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the attribute: EffectiveControlMode Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("EffectiveControlMode", actualValue, 5U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWrite7ToTheControlModeAttributeToDut_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id controlModeArgument;
        controlModeArgument = [NSNumber numberWithUnsignedChar:7U];
        [cluster writeAttributeControlModeWithValue:controlModeArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write 7 to the ControlMode attribute to DUT Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheAttributeEffectiveControlMode_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEffectiveControlModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the attribute: EffectiveControlMode Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("EffectiveControlMode", actualValue, 7U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_PCC_2_4 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_PCC_2_4()
        : TestCommandBridge("Test_TC_PCC_2_4")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_PCC_2_4() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_PCC_2_4\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_PCC_2_4\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Write 1 to the LifetimeRunningHours attribute to DUT\n");
            if (ShouldSkip("PCC.S.A0015")) {
                NextTest();
                return;
            }
            err = TestWrite1ToTheLifetimeRunningHoursAttributeToDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Reads the attribute: LifetimeRunningHours\n");
            if (ShouldSkip("PCC.S.A0015")) {
                NextTest();
                return;
            }
            err = TestReadsTheAttributeLifetimeRunningHours_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Write 2 to the LifetimeRunningHours attribute to DUT\n");
            if (ShouldSkip("PCC.S.A0015")) {
                NextTest();
                return;
            }
            err = TestWrite2ToTheLifetimeRunningHoursAttributeToDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Reads the attribute: LifetimeRunningHours\n");
            if (ShouldSkip("PCC.S.A0015")) {
                NextTest();
                return;
            }
            err = TestReadsTheAttributeLifetimeRunningHours_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Write 3 to the LifetimeRunningHours attribute to DUT\n");
            if (ShouldSkip("PCC.S.A0015")) {
                NextTest();
                return;
            }
            err = TestWrite3ToTheLifetimeRunningHoursAttributeToDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Reads the attribute: LifetimeRunningHours\n");
            if (ShouldSkip("PCC.S.A0015")) {
                NextTest();
                return;
            }
            err = TestReadsTheAttributeLifetimeRunningHours_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Write 1 to the LifetimeEnergyConsumed attribute to DUT\n");
            if (ShouldSkip("PCC.S.A0017")) {
                NextTest();
                return;
            }
            err = TestWrite1ToTheLifetimeEnergyConsumedAttributeToDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Reads the attribute: LifetimeEnergyConsumed\n");
            if (ShouldSkip("PCC.S.A0017")) {
                NextTest();
                return;
            }
            err = TestReadsTheAttributeLifetimeEnergyConsumed_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Write 2 to the LifetimeEnergyConsumed attribute to DUT\n");
            if (ShouldSkip("PCC.S.A0017")) {
                NextTest();
                return;
            }
            err = TestWrite2ToTheLifetimeEnergyConsumedAttributeToDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Reads the attribute: LifetimeEnergyConsumed\n");
            if (ShouldSkip("PCC.S.A0017")) {
                NextTest();
                return;
            }
            err = TestReadsTheAttributeLifetimeEnergyConsumed_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Write 3 to the LifetimeEnergyConsumed attribute to DUT\n");
            if (ShouldSkip("PCC.S.A0017")) {
                NextTest();
                return;
            }
            err = TestWrite3ToTheLifetimeEnergyConsumedAttributeToDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Reads the attribute: LifetimeEnergyConsumed\n");
            if (ShouldSkip("PCC.S.A0017")) {
                NextTest();
                return;
            }
            err = TestReadsTheAttributeLifetimeEnergyConsumed_12();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 13;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestWrite1ToTheLifetimeRunningHoursAttributeToDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id lifetimeRunningHoursArgument;
        lifetimeRunningHoursArgument = [NSNumber numberWithUnsignedInt:1UL];
        [cluster writeAttributeLifetimeRunningHoursWithValue:lifetimeRunningHoursArgument
                                                  completion:^(NSError * _Nullable err) {
                                                      NSLog(@"Write 1 to the LifetimeRunningHours attribute to DUT Error: %@", err);

                                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                      NextTest();
                                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheAttributeLifetimeRunningHours_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLifetimeRunningHoursWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the attribute: LifetimeRunningHours Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("LifetimeRunningHours", actualValue));
                VerifyOrReturn(CheckValue("LifetimeRunningHours", actualValue, 1UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWrite2ToTheLifetimeRunningHoursAttributeToDut_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id lifetimeRunningHoursArgument;
        lifetimeRunningHoursArgument = [NSNumber numberWithUnsignedInt:2UL];
        [cluster writeAttributeLifetimeRunningHoursWithValue:lifetimeRunningHoursArgument
                                                  completion:^(NSError * _Nullable err) {
                                                      NSLog(@"Write 2 to the LifetimeRunningHours attribute to DUT Error: %@", err);

                                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                      NextTest();
                                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheAttributeLifetimeRunningHours_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLifetimeRunningHoursWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the attribute: LifetimeRunningHours Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("LifetimeRunningHours", actualValue));
                VerifyOrReturn(CheckValue("LifetimeRunningHours", actualValue, 2UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWrite3ToTheLifetimeRunningHoursAttributeToDut_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id lifetimeRunningHoursArgument;
        lifetimeRunningHoursArgument = [NSNumber numberWithUnsignedInt:3UL];
        [cluster writeAttributeLifetimeRunningHoursWithValue:lifetimeRunningHoursArgument
                                                  completion:^(NSError * _Nullable err) {
                                                      NSLog(@"Write 3 to the LifetimeRunningHours attribute to DUT Error: %@", err);

                                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                      NextTest();
                                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheAttributeLifetimeRunningHours_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLifetimeRunningHoursWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the attribute: LifetimeRunningHours Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("LifetimeRunningHours", actualValue));
                VerifyOrReturn(CheckValue("LifetimeRunningHours", actualValue, 3UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWrite1ToTheLifetimeEnergyConsumedAttributeToDut_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id lifetimeEnergyConsumedArgument;
        lifetimeEnergyConsumedArgument = [NSNumber numberWithUnsignedInt:1UL];
        [cluster
            writeAttributeLifetimeEnergyConsumedWithValue:lifetimeEnergyConsumedArgument
                                               completion:^(NSError * _Nullable err) {
                                                   NSLog(@"Write 1 to the LifetimeEnergyConsumed attribute to DUT Error: %@", err);

                                                   VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                   NextTest();
                                               }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheAttributeLifetimeEnergyConsumed_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLifetimeEnergyConsumedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the attribute: LifetimeEnergyConsumed Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("LifetimeEnergyConsumed", actualValue));
                VerifyOrReturn(CheckValue("LifetimeEnergyConsumed", actualValue, 1UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWrite2ToTheLifetimeEnergyConsumedAttributeToDut_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id lifetimeEnergyConsumedArgument;
        lifetimeEnergyConsumedArgument = [NSNumber numberWithUnsignedInt:2UL];
        [cluster
            writeAttributeLifetimeEnergyConsumedWithValue:lifetimeEnergyConsumedArgument
                                               completion:^(NSError * _Nullable err) {
                                                   NSLog(@"Write 2 to the LifetimeEnergyConsumed attribute to DUT Error: %@", err);

                                                   VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                   NextTest();
                                               }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheAttributeLifetimeEnergyConsumed_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLifetimeEnergyConsumedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the attribute: LifetimeEnergyConsumed Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("LifetimeEnergyConsumed", actualValue));
                VerifyOrReturn(CheckValue("LifetimeEnergyConsumed", actualValue, 2UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWrite3ToTheLifetimeEnergyConsumedAttributeToDut_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id lifetimeEnergyConsumedArgument;
        lifetimeEnergyConsumedArgument = [NSNumber numberWithUnsignedInt:3UL];
        [cluster
            writeAttributeLifetimeEnergyConsumedWithValue:lifetimeEnergyConsumedArgument
                                               completion:^(NSError * _Nullable err) {
                                                   NSLog(@"Write 3 to the LifetimeEnergyConsumed attribute to DUT Error: %@", err);

                                                   VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                   NextTest();
                                               }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheAttributeLifetimeEnergyConsumed_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLifetimeEnergyConsumedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the attribute: LifetimeEnergyConsumed Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("LifetimeEnergyConsumed", actualValue));
                VerifyOrReturn(CheckValue("LifetimeEnergyConsumed", actualValue, 3UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_PSCFG_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_PSCFG_1_1()
        : TestCommandBridge("Test_TC_PSCFG_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_PSCFG_1_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_PSCFG_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_PSCFG_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Commission DUT to TH\n");
            err = TestCommissionDutToTh_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads the ClusterRevision attribute from the DUT\n");
            err = TestThReadsTheClusterRevisionAttributeFromTheDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads the FeatureMap attribute from the DUT\n");
            err = TestThReadsTheFeatureMapAttributeFromTheDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : TH reads the AttributeList attribute from the DUT\n");
            err = TestThReadsTheAttributeListAttributeFromTheDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH reads the AcceptedCommandList attribute from the DUT\n");
            err = TestThReadsTheAcceptedCommandListAttributeFromTheDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH reads the GeneratedCommandList attribute from the DUT\n");
            err = TestThReadsTheGeneratedCommandListAttributeFromTheDut_5();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 6;

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

    CHIP_ERROR TestCommissionDutToTh_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheClusterRevisionAttributeFromTheDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device
                                                                                    endpointID:@(0)
                                                                                         queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the ClusterRevision attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheFeatureMapAttributeFromTheDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device
                                                                                    endpointID:@(0)
                                                                                         queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the FeatureMap attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheAttributeListAttributeFromTheDut_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device
                                                                                    endpointID:@(0)
                                                                                         queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the AttributeList attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheAcceptedCommandListAttributeFromTheDut_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device
                                                                                    endpointID:@(0)
                                                                                         queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the AcceptedCommandList attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheGeneratedCommandListAttributeFromTheDut_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device
                                                                                    endpointID:@(0)
                                                                                         queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the GeneratedCommandList attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_PSCFG_2_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_PSCFG_2_1()
        : TestCommandBridge("Test_TC_PSCFG_2_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_PSCFG_2_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_PSCFG_2_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_PSCFG_2_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Commission DUT to TH\n");
            err = TestCommissionDutToTh_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads the Sources attribute from the DUT\n");
            if (ShouldSkip("PSCFG.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsTheSourcesAttributeFromTheDut_1();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 2;

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

    CHIP_ERROR TestCommissionDutToTh_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheSourcesAttributeFromTheDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device
                                                                                    endpointID:@(0)
                                                                                         queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSourcesWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the Sources attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("sources", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_RH_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_RH_1_1()
        : TestCommandBridge("Test_TC_RH_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_RH_1_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_RH_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_RH_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read ClusterRevision attribute from the DUT\n");
            err = TestReadClusterRevisionAttributeFromTheDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read FeatureMap attribute from the DUT\n");
            err = TestReadFeatureMapAttributeFromTheDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the optional attribute(Tolerance) in AttributeList\n");
            if (ShouldSkip("RH.S.A0003")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeToleranceInAttributeList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_6();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 7;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadClusterRevisionAttributeFromTheDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read ClusterRevision attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 3U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadFeatureMapAttributeFromTheDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read FeatureMap attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeToleranceInAttributeList_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(Tolerance) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_RH_2_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_RH_2_1()
        : TestCommandBridge("Test_TC_RH_2_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_RH_2_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_RH_2_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_RH_2_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads the MinMeasuredValue attribute from the DUT\n");
            if (ShouldSkip("RH.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsTheMinMeasuredValueAttributeFromTheDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads the MaxMeasuredValue attribute from the DUT\n");
            if (ShouldSkip("RH.S.A0002")) {
                NextTest();
                return;
            }
            err = TestThReadsTheMaxMeasuredValueAttributeFromTheDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : TH reads the MeasuredValue attribute from the DUT\n");
            if (ShouldSkip("RH.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsTheMeasuredValueAttributeFromTheDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH reads the Tolerance attribute from the DUT\n");
            if (ShouldSkip("RH.S.A0003")) {
                NextTest();
                return;
            }
            err = TestThReadsTheToleranceAttributeFromTheDut_4();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 5;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheMinMeasuredValueAttributeFromTheDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the MinMeasuredValue attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("minMeasuredValue", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("minMeasuredValue", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("minMeasuredValue", [value unsignedShortValue], 9999U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheMaxMeasuredValueAttributeFromTheDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the MaxMeasuredValue attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("maxMeasuredValue", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("maxMeasuredValue", [value unsignedShortValue], 1U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("maxMeasuredValue", [value unsignedShortValue], 10000U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheMeasuredValueAttributeFromTheDut_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the MeasuredValue attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("measuredValue", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("measuredValue", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("measuredValue", [value unsignedShortValue], 10000U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheToleranceAttributeFromTheDut_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device
                                                                                       endpointID:@(1)
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeToleranceWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the Tolerance attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("tolerance", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("tolerance", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("tolerance", [value unsignedShortValue], 2048U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_SWTCH_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_SWTCH_1_1()
        : TestCommandBridge("Test_TC_SWTCH_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_SWTCH_1_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_SWTCH_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_SWTCH_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(
                chipTool, " ***** Test Step 2 : Read FeatureMap  attribute and Check values of flags in this FeatureMap\n");
            if (ShouldSkip("!SWTCH.S.F00 && !SWTCH.S.F01 && !SWTCH.S.F02 && !SWTCH.S.F03 && !SWTCH.S.F04")) {
                NextTest();
                return;
            }
            err = TestReadFeatureMapAttributeAndCheckValuesOfFlagsInThisFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Given SWTCH.S.F00(LS) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("SWTCH.S.F00")) {
                NextTest();
                return;
            }
            err = TestGivenSwtchsf00lsEnsureFeaturemapHasTheCorrectBitSet_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Given SWTCH.S.F01(MS) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("SWTCH.S.F01")) {
                NextTest();
                return;
            }
            err = TestGivenSwtchsf01msEnsureFeaturemapHasTheCorrectBitSet_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Given SWTCH.S.F02(MSR) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("SWTCH.S.F02")) {
                NextTest();
                return;
            }
            err = TestGivenSwtchsf02msrEnsureFeaturemapHasTheCorrectBitSet_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Given SWTCH.S.F03(MSL) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("SWTCH.S.F03")) {
                NextTest();
                return;
            }
            err = TestGivenSwtchsf03mslEnsureFeaturemapHasTheCorrectBitSet_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Given SWTCH.S.F04(MSM) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("SWTCH.S.F04")) {
                NextTest();
                return;
            }
            err = TestGivenSwtchsf04msmEnsureFeaturemapHasTheCorrectBitSet_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read the global attribute: AttributeList\n");
            if (ShouldSkip("SWTCH.S.F04")) {
                NextTest();
                return;
            }
            err = TestReadTheGlobalAttributeAttributeList_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Read the global attribute: AttributeList\n");
            if (ShouldSkip("!SWTCH.S.F04")) {
                NextTest();
                return;
            }
            err = TestReadTheGlobalAttributeAttributeList_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_11();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 12;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadFeatureMapAttributeAndCheckValuesOfFlagsInThisFeatureMap_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read FeatureMap  attribute and Check values of flags in this FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenSwtchsf00lsEnsureFeaturemapHasTheCorrectBitSet_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given SWTCH.S.F00(LS) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenSwtchsf01msEnsureFeaturemapHasTheCorrectBitSet_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given SWTCH.S.F01(MS) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenSwtchsf02msrEnsureFeaturemapHasTheCorrectBitSet_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given SWTCH.S.F02(MSR) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenSwtchsf03mslEnsureFeaturemapHasTheCorrectBitSet_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given SWTCH.S.F03(MSL) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenSwtchsf04msmEnsureFeaturemapHasTheCorrectBitSet_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given SWTCH.S.F04(MSM) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_TMP_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_TMP_1_1()
        : TestCommandBridge("Test_TC_TMP_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_TMP_1_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_TMP_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_TMP_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read ClusterRevision attribute from the DUT\n");
            err = TestReadClusterRevisionAttributeFromTheDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read FeatureMap attribute from the DUT\n");
            err = TestReadFeatureMapAttributeFromTheDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the optional attribute(Tolerance) in AttributeList\n");
            if (ShouldSkip("TMP.S.A0003")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeToleranceInAttributeList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read AcceptedCommandList attribute from the DUT\n");
            err = TestReadAcceptedCommandListAttributeFromTheDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read GeneratedCommandList attribute from the DUT\n");
            err = TestReadGeneratedCommandListAttributeFromTheDut_6();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 7;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadClusterRevisionAttributeFromTheDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device
                                                                                  endpointID:@(1)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read ClusterRevision attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 4U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadFeatureMapAttributeFromTheDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device
                                                                                  endpointID:@(1)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read FeatureMap attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device
                                                                                  endpointID:@(1)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeToleranceInAttributeList_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device
                                                                                  endpointID:@(1)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(Tolerance) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAcceptedCommandListAttributeFromTheDut_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device
                                                                                  endpointID:@(1)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read AcceptedCommandList attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadGeneratedCommandListAttributeFromTheDut_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device
                                                                                  endpointID:@(1)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read GeneratedCommandList attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_TMP_2_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_TMP_2_1()
        : TestCommandBridge("Test_TC_TMP_2_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_TMP_2_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_TMP_2_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_TMP_2_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read the mandatory attribute: MinMeasuredValue\n");
            if (ShouldSkip("TMP.S.A0001")) {
                NextTest();
                return;
            }
            err = TestReadTheMandatoryAttributeMinMeasuredValue_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the mandatory attribute: MaxMeasuredValue\n");
            if (ShouldSkip("TMP.S.A0002")) {
                NextTest();
                return;
            }
            err = TestReadTheMandatoryAttributeMaxMeasuredValue_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the mandatory attribute: MeasuredValue\n");
            if (ShouldSkip("TMP.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadTheMandatoryAttributeMeasuredValue_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the optional attribute: Tolerance\n");
            if (ShouldSkip("TMP.S.A0003")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeTolerance_4();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 5;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheMandatoryAttributeMinMeasuredValue_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device
                                                                                  endpointID:@(1)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the mandatory attribute: MinMeasuredValue Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("minMeasuredValue", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue<int16_t>("minMeasuredValue", [value shortValue], -27315));
                VerifyOrReturn(CheckConstraintMaxValue<int16_t>("minMeasuredValue", [value shortValue], 32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheMandatoryAttributeMaxMeasuredValue_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device
                                                                                  endpointID:@(1)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the mandatory attribute: MaxMeasuredValue Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("maxMeasuredValue", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue<int16_t>("maxMeasuredValue", [value shortValue], -27314));
                VerifyOrReturn(CheckConstraintMaxValue<int16_t>("maxMeasuredValue", [value shortValue], 32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheMandatoryAttributeMeasuredValue_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device
                                                                                  endpointID:@(1)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the mandatory attribute: MeasuredValue Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("measuredValue", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue<int16_t>("measuredValue", [value shortValue], -27315));
                VerifyOrReturn(CheckConstraintMaxValue<int16_t>("measuredValue", [value shortValue], 32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeTolerance_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device
                                                                                  endpointID:@(1)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeToleranceWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute: Tolerance Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("tolerance", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("tolerance", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("tolerance", [value unsignedShortValue], 2048U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_TSTAT_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_TSTAT_1_1()
        : TestCommandBridge("Test_TC_TSTAT_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_TSTAT_1_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_TSTAT_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_TSTAT_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            if (ShouldSkip("!TSTAT.S.F00 && !TSTAT.S.F01 && !TSTAT.S.F02 && !TSTAT.S.F03 && !TSTAT.S.F04 && !TSTAT.S.F05")) {
                NextTest();
                return;
            }
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Given TSTAT.S.F00(HEAT ensure featuremap has the correct bit set\n");
            if (ShouldSkip("TSTAT.S.F00")) {
                NextTest();
                return;
            }
            err = TestGivenTstatsf00heatEnsureFeaturemapHasTheCorrectBitSet_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Given TSTAT.S.F01(COOL) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("TSTAT.S.F01")) {
                NextTest();
                return;
            }
            err = TestGivenTstatsf01coolEnsureFeaturemapHasTheCorrectBitSet_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Given TSTAT.S.F02(OCC) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("TSTAT.S.F02")) {
                NextTest();
                return;
            }
            err = TestGivenTstatsf02occEnsureFeaturemapHasTheCorrectBitSet_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Given TSTAT.S.F03(SCH) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("TSTAT.S.F03")) {
                NextTest();
                return;
            }
            err = TestGivenTstatsf03schEnsureFeaturemapHasTheCorrectBitSet_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Given TSTAT.S.F04(SB) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("TSTAT.S.F04")) {
                NextTest();
                return;
            }
            err = TestGivenTstatsf04sbEnsureFeaturemapHasTheCorrectBitSet_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Given TSTAT.S.F05(AUTO) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("TSTAT.S.F05")) {
                NextTest();
                return;
            }
            err = TestGivenTstatsf05autoEnsureFeaturemapHasTheCorrectBitSet_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_9();
            break;
        case 10:
            ChipLogProgress(
                chipTool, " ***** Test Step 10 : Read the Feature dependent(TSTAT.S.F00(HEAT)) attribute in AttributeList\n");
            if (ShouldSkip("TSTAT.S.F00")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentTSTATSF00HEATAttributeInAttributeList_10();
            break;
        case 11:
            ChipLogProgress(
                chipTool, " ***** Test Step 11 : Read the Feature dependent(TSTAT.S.F01(COOL)) attribute in AttributeList\n");
            if (ShouldSkip("TSTAT.S.F01")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentTSTATSF01COOLAttributeInAttributeList_11();
            break;
        case 12:
            ChipLogProgress(
                chipTool, " ***** Test Step 12 : Read the Feature dependent(TSTAT.S.F02(OCC)) attribute in AttributeList\n");
            if (ShouldSkip("TSTAT.S.F02")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentTSTATSF02OCCAttributeInAttributeList_12();
            break;
        case 13:
            ChipLogProgress(chipTool,
                " ***** Test Step 13 : Read the Feature dependent(TSTAT.S.F00(HEAT) & TSTAT.S.F02(OCC)) attribute in "
                "AttributeList\n");
            if (ShouldSkip("TSTAT.S.F00 && TSTAT.S.F02")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentTSTATSF00HEATTstatsf02occAttributeInAttributeList_13();
            break;
        case 14:
            ChipLogProgress(chipTool,
                " ***** Test Step 14 : Read the Feature dependent(TSTAT.S.F01(COOL) & TSTAT.S.F02(OCC)) attribute in "
                "AttributeList\n");
            if (ShouldSkip("TSTAT.S.F01 && TSTAT.S.F02")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentTSTATSF01COOLTstatsf02occAttributeInAttributeList_14();
            break;
        case 15:
            ChipLogProgress(
                chipTool, " ***** Test Step 15 : Read the Feature dependent(TSTAT.S.F05(AUTO)) attribute in AttributeList\n");
            if (ShouldSkip("TSTAT.S.F05")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentTSTATSF05AUTOAttributeInAttributeList_15();
            break;
        case 16:
            ChipLogProgress(
                chipTool, " ***** Test Step 16 : Read the Feature dependent(TSTAT.S.F03(SCH)) attribute in AttributeList\n");
            if (ShouldSkip("TSTAT.S.F03")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentTSTATSF03SCHAttributeInAttributeList_16();
            break;
        case 17:
            ChipLogProgress(
                chipTool, " ***** Test Step 17 : Read the Feature dependent(TSTAT.S.F04(SB)) attribute in AttributeList\n");
            if (ShouldSkip("TSTAT.S.F04")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentTSTATSF04SBAttributeInAttributeList_17();
            break;
        case 18:
            ChipLogProgress(chipTool,
                " ***** Test Step 18 : Read the Feature dependent(TSTAT.S.F04(SB) & TSTAT.S.F02(OCC)) attribute in "
                "AttributeList\n");
            if (ShouldSkip("TSTAT.S.F04 && TSTAT.S.F02")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentTSTATSF04SBTstatsf02occAttributeInAttributeList_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_19();
            break;
        case 20:
            ChipLogProgress(
                chipTool, " ***** Test Step 20 : Read Feature dependent(TSTAT.S.F03(SCH)) commands in AcceptedCommandList\n");
            if (ShouldSkip("TSTAT.S.F03")) {
                NextTest();
                return;
            }
            err = TestReadFeatureDependentTSTATSF03SCHCommandsInAcceptedCommandList_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_21();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 22;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 5U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenTstatsf00heatEnsureFeaturemapHasTheCorrectBitSet_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given TSTAT.S.F00(HEAT ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenTstatsf01coolEnsureFeaturemapHasTheCorrectBitSet_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given TSTAT.S.F01(COOL) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenTstatsf02occEnsureFeaturemapHasTheCorrectBitSet_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given TSTAT.S.F02(OCC) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenTstatsf03schEnsureFeaturemapHasTheCorrectBitSet_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given TSTAT.S.F03(SCH) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenTstatsf04sbEnsureFeaturemapHasTheCorrectBitSet_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given TSTAT.S.F04(SB) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenTstatsf05autoEnsureFeaturemapHasTheCorrectBitSet_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given TSTAT.S.F05(AUTO) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 27UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 28UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheFeatureDependentTSTATSF00HEATAttributeInAttributeList_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the Feature dependent(TSTAT.S.F00(HEAT)) attribute in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 18UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheFeatureDependentTSTATSF01COOLAttributeInAttributeList_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the Feature dependent(TSTAT.S.F01(COOL)) attribute in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 17UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheFeatureDependentTSTATSF02OCCAttributeInAttributeList_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the Feature dependent(TSTAT.S.F02(OCC)) attribute in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheFeatureDependentTSTATSF00HEATTstatsf02occAttributeInAttributeList_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the Feature dependent(TSTAT.S.F00(HEAT) & TSTAT.S.F02(OCC)) attribute in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 20UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheFeatureDependentTSTATSF01COOLTstatsf02occAttributeInAttributeList_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the Feature dependent(TSTAT.S.F01(COOL) & TSTAT.S.F02(OCC)) attribute in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 19UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheFeatureDependentTSTATSF05AUTOAttributeInAttributeList_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the Feature dependent(TSTAT.S.F05(AUTO)) attribute in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 17UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 18UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 25UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheFeatureDependentTSTATSF03SCHAttributeInAttributeList_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the Feature dependent(TSTAT.S.F03(SCH)) attribute in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 32UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 33UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 34UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheFeatureDependentTSTATSF04SBAttributeInAttributeList_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the Feature dependent(TSTAT.S.F04(SB)) attribute in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 52UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 53UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 54UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheFeatureDependentTSTATSF04SBTstatsf02occAttributeInAttributeList_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the Feature dependent(TSTAT.S.F04(SB) & TSTAT.S.F02(OCC)) attribute in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 55UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 56UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 57UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_19()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadFeatureDependentTSTATSF03SCHCommandsInAcceptedCommandList_20()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read Feature dependent(TSTAT.S.F03(SCH)) commands in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_21()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_TSUIC_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_TSUIC_1_1()
        : TestCommandBridge("Test_TC_TSUIC_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_TSUIC_1_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_TSUIC_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_TSUIC_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH read ClusterRevision attribute from the DUT\n");
            err = TestThReadClusterRevisionAttributeFromTheDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read FeatureMap attribute from the DUT\n");
            err = TestReadFeatureMapAttributeFromTheDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_5();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 6;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadClusterRevisionAttributeFromTheDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
                                                                                                endpointID:@(1)
                                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH read ClusterRevision attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 2U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadFeatureMapAttributeFromTheDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
                                                                                                endpointID:@(1)
                                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read FeatureMap attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
                                                                                                endpointID:@(1)
                                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
                                                                                                endpointID:@(1)
                                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
                                                                                                endpointID:@(1)
                                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_TSUIC_2_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_TSUIC_2_1()
        : TestCommandBridge("Test_TC_TSUIC_2_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_TSUIC_2_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_TSUIC_2_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_TSUIC_2_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read the mandatory attribute: TemperatureDisplayMode\n");
            if (ShouldSkip("TSUIC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadTheMandatoryAttributeTemperatureDisplayMode_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the mandatory attribute: KeypadLockout\n");
            if (ShouldSkip("TSUIC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestReadTheMandatoryAttributeKeypadLockout_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the optional attribute: ScheduleProgrammingVisibility\n");
            if (ShouldSkip("TSUIC.S.A0002")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeScheduleProgrammingVisibility_3();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 4;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheMandatoryAttributeTemperatureDisplayMode_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
                                                                                                endpointID:@(1)
                                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTemperatureDisplayModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the mandatory attribute: TemperatureDisplayMode Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("temperatureDisplayMode", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("temperatureDisplayMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("temperatureDisplayMode", [value unsignedCharValue], 1U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheMandatoryAttributeKeypadLockout_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
                                                                                                endpointID:@(1)
                                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeKeypadLockoutWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the mandatory attribute: KeypadLockout Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("keypadLockout", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("keypadLockout", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("keypadLockout", [value unsignedCharValue], 5U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeScheduleProgrammingVisibility_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
                                                                                                endpointID:@(1)
                                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeScheduleProgrammingVisibilityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute: ScheduleProgrammingVisibility Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("scheduleProgrammingVisibility", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("scheduleProgrammingVisibility", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("scheduleProgrammingVisibility", [value unsignedCharValue], 1U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_TSUIC_2_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_TSUIC_2_2()
        : TestCommandBridge("Test_TC_TSUIC_2_2")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_TSUIC_2_2() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_TSUIC_2_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_TSUIC_2_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Writes a value of 0 to TemperatureDisplayMode attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestWritesAValueOf0ToTemperatureDisplayModeAttributeOfDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Verify device temperature displayed in °C\n");
            if (ShouldSkip("PICS_USER_PROMPT && TSUIC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestVerifyDeviceTemperatureDisplayedInc_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : TH reads the TemperatureDisplayMode attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsTheTemperatureDisplayModeAttributeOfDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Writes a value of 1 to TemperatureDisplayMode attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestWritesAValueOf1ToTemperatureDisplayModeAttributeOfDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Verify device temperature displayed in °F\n");
            if (ShouldSkip("PICS_USER_PROMPT && TSUIC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestVerifyDeviceTemperatureDisplayedInf_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : TH reads the TemperatureDisplayMode attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsTheTemperatureDisplayModeAttributeOfDut_6();
            break;
        case 7:
            ChipLogProgress(
                chipTool, " ***** Test Step 7 : Writes a value of greater than 1 to TemperatureDisplayMode attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestWritesAValueOfGreaterThan1ToTemperatureDisplayModeAttributeOfDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : TH reads the TemperatureDisplayMode attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsTheTemperatureDisplayModeAttributeOfDut_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Writes a value of 0 to KeypadLockout attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestWritesAValueOf0ToKeypadLockoutAttributeOfDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Verify all device functionality available to the user\n");
            if (ShouldSkip("PICS_USER_PROMPT && TSUIC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestVerifyAllDeviceFunctionalityAvailableToTheUser_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : TH reads the KeypadLockout attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsTheKeypadLockoutAttributeOfDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Writes a value of 1 to KeypadLockout attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestWritesAValueOf1ToKeypadLockoutAttributeOfDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Verify device operates at Level 1 reduced functionality\n");
            if (ShouldSkip("PICS_USER_PROMPT && TSUIC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestVerifyDeviceOperatesAtLevel1ReducedFunctionality_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : TH reads the KeypadLockout attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsTheKeypadLockoutAttributeOfDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Writes a value of 2 to KeypadLockout attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestWritesAValueOf2ToKeypadLockoutAttributeOfDut_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Verify device operates at Level 2 reduced functionality\n");
            if (ShouldSkip("PICS_USER_PROMPT && TSUIC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestVerifyDeviceOperatesAtLevel2ReducedFunctionality_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : TH reads the KeypadLockout attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsTheKeypadLockoutAttributeOfDut_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Writes a value of 3 to KeypadLockout attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestWritesAValueOf3ToKeypadLockoutAttributeOfDut_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Verify device operates at Level 3 reduced functionality\n");
            if (ShouldSkip("PICS_USER_PROMPT && TSUIC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestVerifyDeviceOperatesAtLevel3ReducedFunctionality_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : TH reads the KeypadLockout attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsTheKeypadLockoutAttributeOfDut_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Writes a value of 4 to KeypadLockout attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestWritesAValueOf4ToKeypadLockoutAttributeOfDut_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : Verify device operates at Level 4 reduced functionality\n");
            if (ShouldSkip("PICS_USER_PROMPT && TSUIC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestVerifyDeviceOperatesAtLevel4ReducedFunctionality_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : TH reads the KeypadLockout attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsTheKeypadLockoutAttributeOfDut_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : Writes a value of 5 to KeypadLockout attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestWritesAValueOf5ToKeypadLockoutAttributeOfDut_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : Verify device operates at least functionality level\n");
            if (ShouldSkip("PICS_USER_PROMPT && TSUIC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestVerifyDeviceOperatesAtLeastFunctionalityLevel_25();
            break;
        case 26:
            ChipLogProgress(chipTool, " ***** Test Step 26 : TH reads the KeypadLockout attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsTheKeypadLockoutAttributeOfDut_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : Writes a value of greater than 5 to KeypadLockout attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestWritesAValueOfGreaterThan5ToKeypadLockoutAttributeOfDut_27();
            break;
        case 28:
            ChipLogProgress(chipTool, " ***** Test Step 28 : TH reads the KeypadLockout attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsTheKeypadLockoutAttributeOfDut_28();
            break;
        case 29:
            ChipLogProgress(
                chipTool, " ***** Test Step 29 : Writes a value of 0 to ScheduleProgrammingVisibility attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0002")) {
                NextTest();
                return;
            }
            err = TestWritesAValueOf0ToScheduleProgrammingVisibilityAttributeOfDut_29();
            break;
        case 30:
            ChipLogProgress(
                chipTool, " ***** Test Step 30 : Verify local schedule programming functionality is enabled at the thermostat\n");
            if (ShouldSkip("PICS_USER_PROMPT && TSUIC.S.A0002")) {
                NextTest();
                return;
            }
            err = TestVerifyLocalScheduleProgrammingFunctionalityIsEnabledAtTheThermostat_30();
            break;
        case 31:
            ChipLogProgress(chipTool, " ***** Test Step 31 : TH reads the ScheduleProgrammingVisibility attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0002")) {
                NextTest();
                return;
            }
            err = TestThReadsTheScheduleProgrammingVisibilityAttributeOfDut_31();
            break;
        case 32:
            ChipLogProgress(
                chipTool, " ***** Test Step 32 : Writes a value of 1 to ScheduleProgrammingVisibility attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0002")) {
                NextTest();
                return;
            }
            err = TestWritesAValueOf1ToScheduleProgrammingVisibilityAttributeOfDut_32();
            break;
        case 33:
            ChipLogProgress(
                chipTool, " ***** Test Step 33 : Verify local schedule programming functionality is disabled at the thermostat\n");
            if (ShouldSkip("PICS_USER_PROMPT && TSUIC.S.A0002")) {
                NextTest();
                return;
            }
            err = TestVerifyLocalScheduleProgrammingFunctionalityIsDisabledAtTheThermostat_33();
            break;
        case 34:
            ChipLogProgress(chipTool, " ***** Test Step 34 : TH reads the ScheduleProgrammingVisibility attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0002")) {
                NextTest();
                return;
            }
            err = TestThReadsTheScheduleProgrammingVisibilityAttributeOfDut_34();
            break;
        case 35:
            ChipLogProgress(chipTool,
                " ***** Test Step 35 : Writes a value of greater than 1 to ScheduleProgrammingVisibility attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0002")) {
                NextTest();
                return;
            }
            err = TestWritesAValueOfGreaterThan1ToScheduleProgrammingVisibilityAttributeOfDut_35();
            break;
        case 36:
            ChipLogProgress(chipTool, " ***** Test Step 36 : TH reads the ScheduleProgrammingVisibility attribute of DUT\n");
            if (ShouldSkip("TSUIC.S.A0002")) {
                NextTest();
                return;
            }
            err = TestThReadsTheScheduleProgrammingVisibilityAttributeOfDut_36();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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));
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 37;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestWritesAValueOf0ToTemperatureDisplayModeAttributeOfDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
                                                                                                endpointID:@(1)
                                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id temperatureDisplayModeArgument;
        temperatureDisplayModeArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster
            writeAttributeTemperatureDisplayModeWithValue:temperatureDisplayModeArgument
                                               completion:^(NSError * _Nullable err) {
                                                   NSLog(
                                                       @"Writes a value of 0 to TemperatureDisplayMode attribute of DUT Error: %@",
                                                       err);

                                                   VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                   NextTest();
                                               }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyDeviceTemperatureDisplayedInc_2()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestThReadsTheTemperatureDisplayModeAttributeOfDut_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
                                                                                                endpointID:@(1)
                                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTemperatureDisplayModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the TemperatureDisplayMode attribute of DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesAValueOf1ToTemperatureDisplayModeAttributeOfDut_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
                                                                                                endpointID:@(1)
                                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id temperatureDisplayModeArgument;
        temperatureDisplayModeArgument = [NSNumber numberWithUnsignedChar:1U];
        [cluster
            writeAttributeTemperatureDisplayModeWithValue:temperatureDisplayModeArgument
                                               completion:^(NSError * _Nullable err) {
                                                   NSLog(
                                                       @"Writes a value of 1 to TemperatureDisplayMode attribute of DUT Error: %@",
                                                       err);

                                                   VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                   NextTest();
                                               }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyDeviceTemperatureDisplayedInf_5()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestThReadsTheTemperatureDisplayModeAttributeOfDut_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
                                                                                                endpointID:@(1)
                                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTemperatureDisplayModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the TemperatureDisplayMode attribute of DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("TemperatureDisplayMode", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesAValueOfGreaterThan1ToTemperatureDisplayModeAttributeOfDut_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
                                                                                                endpointID:@(1)
                                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id temperatureDisplayModeArgument;
        temperatureDisplayModeArgument = [NSNumber numberWithUnsignedChar:2U];
        [cluster writeAttributeTemperatureDisplayModeWithValue:temperatureDisplayModeArgument
                                                    completion:^(NSError * _Nullable err) {
                                                        NSLog(@"Writes a value of greater than 1 to TemperatureDisplayMode "
                                                              @"attribute of DUT Error: %@",
                                                            err);

                                                        VerifyOrReturn(CheckValue("status",
                                                            err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                    ? err.code
                                                                    : EMBER_ZCL_STATUS_FAILURE)
                                                                : 0,
                                                            EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                        NextTest();
                                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheTemperatureDisplayModeAttributeOfDut_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
                                                                                                endpointID:@(1)
                                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTemperatureDisplayModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the TemperatureDisplayMode attribute of DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("TemperatureDisplayMode", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesAValueOf0ToKeypadLockoutAttributeOfDut_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
                                                                                                endpointID:@(1)
                                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id keypadLockoutArgument;
        keypadLockoutArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeKeypadLockoutWithValue:keypadLockoutArgument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"Writes a value of 0 to KeypadLockout attribute of DUT Error: %@", err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyAllDeviceFunctionalityAvailableToTheUser_10()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestThReadsTheKeypadLockoutAttributeOfDut_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
                                                                                                endpointID:@(1)
                                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeKeypadLockoutWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the KeypadLockout attribute of DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("KeypadLockout", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesAValueOf1ToKeypadLockoutAttributeOfDut_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
                                                                                                endpointID:@(1)
                                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id keypadLockoutArgument;
        keypadLockoutArgument = [NSNumber numberWithUnsignedChar:1U];
        [cluster writeAttributeKeypadLockoutWithValue:keypadLockoutArgument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"Writes a value of 1 to KeypadLockout attribute of DUT Error: %@", err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyDeviceOperatesAtLevel1ReducedFunctionality_13()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestThReadsTheKeypadLockoutAttributeOfDut_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
                                                                                                endpointID:@(1)
                                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeKeypadLockoutWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the KeypadLockout attribute of DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("KeypadLockout", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesAValueOf2ToKeypadLockoutAttributeOfDut_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
                                                                                                endpointID:@(1)
                                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id keypadLockoutArgument;
        keypadLockoutArgument = [NSNumber numberWithUnsignedChar:2U];
        [cluster writeAttributeKeypadLockoutWithValue:keypadLockoutArgument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"Writes a value of 2 to KeypadLockout attribute of DUT Error: %@", err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyDeviceOperatesAtLevel2ReducedFunctionality_16()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestThReadsTheKeypadLockoutAttributeOfDut_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
                                                                                                endpointID:@(1)
                                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeKeypadLockoutWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the KeypadLockout attribute of DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("KeypadLockout", actualValue, 2U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesAValueOf3ToKeypadLockoutAttributeOfDut_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
                                                                                                endpointID:@(1)
                                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id keypadLockoutArgument;
        keypadLockoutArgument = [NSNumber numberWithUnsignedChar:3U];
        [cluster writeAttributeKeypadLockoutWithValue:keypadLockoutArgument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"Writes a value of 3 to KeypadLockout attribute of DUT Error: %@", err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyDeviceOperatesAtLevel3ReducedFunctionality_19()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestThReadsTheKeypadLockoutAttributeOfDut_20()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
                                                                                                endpointID:@(1)
                                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeKeypadLockoutWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the KeypadLockout attribute of DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("KeypadLockout", actualValue, 3U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesAValueOf4ToKeypadLockoutAttributeOfDut_21()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
                                                                                                endpointID:@(1)
                                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id keypadLockoutArgument;
        keypadLockoutArgument = [NSNumber numberWithUnsignedChar:4U];
        [cluster writeAttributeKeypadLockoutWithValue:keypadLockoutArgument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"Writes a value of 4 to KeypadLockout attribute of DUT Error: %@", err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyDeviceOperatesAtLevel4ReducedFunctionality_22()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestThReadsTheKeypadLockoutAttributeOfDut_23()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
                                                                                                endpointID:@(1)
                                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeKeypadLockoutWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the KeypadLockout attribute of DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("KeypadLockout", actualValue, 4U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesAValueOf5ToKeypadLockoutAttributeOfDut_24()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
                                                                                                endpointID:@(1)
                                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id keypadLockoutArgument;
        keypadLockoutArgument = [NSNumber numberWithUnsignedChar:5U];
        [cluster writeAttributeKeypadLockoutWithValue:keypadLockoutArgument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"Writes a value of 5 to KeypadLockout attribute of DUT Error: %@", err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyDeviceOperatesAtLeastFunctionalityLevel_25()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestThReadsTheKeypadLockoutAttributeOfDut_26()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
                                                                                                endpointID:@(1)
                                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeKeypadLockoutWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the KeypadLockout attribute of DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("KeypadLockout", actualValue, 5U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesAValueOfGreaterThan5ToKeypadLockoutAttributeOfDut_27()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
                                                                                                endpointID:@(1)
                                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id keypadLockoutArgument;
        keypadLockoutArgument = [NSNumber numberWithUnsignedChar:6U];
        [cluster
            writeAttributeKeypadLockoutWithValue:keypadLockoutArgument
                                      completion:^(NSError * _Nullable err) {
                                          NSLog(
                                              @"Writes a value of greater than 5 to KeypadLockout attribute of DUT Error: %@", err);

                                          VerifyOrReturn(CheckValue("status",
                                              err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                      ? err.code
                                                      : EMBER_ZCL_STATUS_FAILURE)
                                                  : 0,
                                              EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                          NextTest();
                                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheKeypadLockoutAttributeOfDut_28()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
                                                                                                endpointID:@(1)
                                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeKeypadLockoutWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the KeypadLockout attribute of DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("KeypadLockout", actualValue, 5U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesAValueOf0ToScheduleProgrammingVisibilityAttributeOfDut_29()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
                                                                                                endpointID:@(1)
                                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id scheduleProgrammingVisibilityArgument;
        scheduleProgrammingVisibilityArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeScheduleProgrammingVisibilityWithValue:scheduleProgrammingVisibilityArgument
                                                           completion:^(NSError * _Nullable err) {
                                                               NSLog(@"Writes a value of 0 to ScheduleProgrammingVisibility "
                                                                     @"attribute of DUT Error: %@",
                                                                   err);

                                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                               NextTest();
                                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyLocalScheduleProgrammingFunctionalityIsEnabledAtTheThermostat_30()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestThReadsTheScheduleProgrammingVisibilityAttributeOfDut_31()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
                                                                                                endpointID:@(1)
                                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeScheduleProgrammingVisibilityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the ScheduleProgrammingVisibility attribute of DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ScheduleProgrammingVisibility", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesAValueOf1ToScheduleProgrammingVisibilityAttributeOfDut_32()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
                                                                                                endpointID:@(1)
                                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id scheduleProgrammingVisibilityArgument;
        scheduleProgrammingVisibilityArgument = [NSNumber numberWithUnsignedChar:1U];
        [cluster writeAttributeScheduleProgrammingVisibilityWithValue:scheduleProgrammingVisibilityArgument
                                                           completion:^(NSError * _Nullable err) {
                                                               NSLog(@"Writes a value of 1 to ScheduleProgrammingVisibility "
                                                                     @"attribute of DUT Error: %@",
                                                                   err);

                                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                               NextTest();
                                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyLocalScheduleProgrammingFunctionalityIsDisabledAtTheThermostat_33()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestThReadsTheScheduleProgrammingVisibilityAttributeOfDut_34()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
                                                                                                endpointID:@(1)
                                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeScheduleProgrammingVisibilityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the ScheduleProgrammingVisibility attribute of DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ScheduleProgrammingVisibility", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesAValueOfGreaterThan1ToScheduleProgrammingVisibilityAttributeOfDut_35()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
                                                                                                endpointID:@(1)
                                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id scheduleProgrammingVisibilityArgument;
        scheduleProgrammingVisibilityArgument = [NSNumber numberWithUnsignedChar:2U];
        [cluster writeAttributeScheduleProgrammingVisibilityWithValue:scheduleProgrammingVisibilityArgument
                                                           completion:^(NSError * _Nullable err) {
                                                               NSLog(@"Writes a value of greater than 1 to "
                                                                     @"ScheduleProgrammingVisibility attribute of DUT Error: %@",
                                                                   err);

                                                               VerifyOrReturn(CheckValue("status",
                                                                   err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                           ? err.code
                                                                           : EMBER_ZCL_STATUS_FAILURE)
                                                                       : 0,
                                                                   EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                               NextTest();
                                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheScheduleProgrammingVisibilityAttributeOfDut_36()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
                                                                                                endpointID:@(1)
                                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeScheduleProgrammingVisibilityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the ScheduleProgrammingVisibility attribute of DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ScheduleProgrammingVisibility", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGTHREAD_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_DGTHREAD_1_1()
        : TestCommandBridge("Test_TC_DGTHREAD_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_DGTHREAD_1_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_DGTHREAD_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_DGTHREAD_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads the ClusterRevision from DUT\n");
            err = TestThReadsTheClusterRevisionFromDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads the FeatureMap from DUT\n");
            if (ShouldSkip(" !DGTHREAD.S.F00 && !DGTHREAD.S.F01 && !DGTHREAD.S.F02 && !DGTHREAD.S.F03 ")) {
                NextTest();
                return;
            }
            err = TestThReadsTheFeatureMapFromDut_2();
            break;
        case 3:
            ChipLogProgress(
                chipTool, " ***** Test Step 3 : Given DGTHREAD.S.F00(PKTCNT) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("DGTHREAD.S.F00")) {
                NextTest();
                return;
            }
            err = TestGivenDgthreadsf00pktcntEnsureFeaturemapHasTheCorrectBitSet_3();
            break;
        case 4:
            ChipLogProgress(
                chipTool, " ***** Test Step 4 : Given DGTHREAD.S.F01(ERRCNT) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("DGTHREAD.S.F01")) {
                NextTest();
                return;
            }
            err = TestGivenDgthreadsf01errcntEnsureFeaturemapHasTheCorrectBitSet_4();
            break;
        case 5:
            ChipLogProgress(
                chipTool, " ***** Test Step 5 : Given DGTHREAD.S.F02(MLECNT) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("DGTHREAD.S.F02")) {
                NextTest();
                return;
            }
            err = TestGivenDgthreadsf02mlecntEnsureFeaturemapHasTheCorrectBitSet_5();
            break;
        case 6:
            ChipLogProgress(
                chipTool, " ***** Test Step 6 : Given DGTHREAD.S.F03(MACCNT) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("DGTHREAD.S.F03")) {
                NextTest();
                return;
            }
            err = TestGivenDgthreadsf03maccntEnsureFeaturemapHasTheCorrectBitSet_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH reads mandatory attributes in AttributeList from DUT\n");
            err = TestThReadsMandatoryAttributesInAttributeListFromDut_7();
            break;
        case 8:
            ChipLogProgress(
                chipTool, " ***** Test Step 8 : TH reads Feature dependent attribute(DGTHREAD.S.F01(ERRCNT)) in attributeList\n");
            if (ShouldSkip("DGTHREAD.C.A0006 && DGTHREAD.S.F01")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentAttributeDGTHREADSF01ERRCNTInAttributeList_8();
            break;
        case 9:
            ChipLogProgress(
                chipTool, " ***** Test Step 9 : TH reads Feature dependent attribute (DGTHREAD.S.F02(MLECNT)) in attributeList\n");
            if (ShouldSkip("DGTHREAD.S.F02")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentAttributeDgthreadsf02mlecntInAttributeList_9();
            break;
        case 10:
            ChipLogProgress(
                chipTool, " ***** Test Step 10 : TH reads Feature dependent attribute (DGTHREAD.S.F03(MACCNT)) in attributeList\n");
            if (ShouldSkip("DGTHREAD.S.F03")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentAttributeDgthreadsf03maccntInAttributeList_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Read the optional attribute (ActiveTimestamp) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0038")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeActiveTimestampInAttributeList_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Read the optional attribute (PendingTimestamp) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0039")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributePendingTimestampInAttributeList_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Read the optional attribute (Delay) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A003a")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeDelayInAttributeList_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : TH reads AcceptedCommandList from DUT\n");
            err = TestThReadsAcceptedCommandListFromDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : TH reads GeneratedCommandList from DUT\n");
            err = TestThReadsGeneratedCommandListFromDut_15();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 16;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheClusterRevisionFromDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
                                                                                    endpointID:@(0)
                                                                                         queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the ClusterRevision from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheFeatureMapFromDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
                                                                                    endpointID:@(0)
                                                                                         queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the FeatureMap from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenDgthreadsf00pktcntEnsureFeaturemapHasTheCorrectBitSet_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
                                                                                    endpointID:@(0)
                                                                                         queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given DGTHREAD.S.F00(PKTCNT) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenDgthreadsf01errcntEnsureFeaturemapHasTheCorrectBitSet_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
                                                                                    endpointID:@(0)
                                                                                         queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given DGTHREAD.S.F01(ERRCNT) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenDgthreadsf02mlecntEnsureFeaturemapHasTheCorrectBitSet_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
                                                                                    endpointID:@(0)
                                                                                         queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given DGTHREAD.S.F02(MLECNT) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenDgthreadsf03maccntEnsureFeaturemapHasTheCorrectBitSet_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
                                                                                    endpointID:@(0)
                                                                                         queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given DGTHREAD.S.F03(MACCNT) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsMandatoryAttributesInAttributeListFromDut_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
                                                                                    endpointID:@(0)
                                                                                         queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads mandatory attributes in AttributeList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 3UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 4UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 5UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 7UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 8UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 9UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 10UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 11UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 12UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 13UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 59UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 60UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 61UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 62UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentAttributeDGTHREADSF01ERRCNTInAttributeList_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
                                                                                    endpointID:@(0)
                                                                                         queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent attribute(DGTHREAD.S.F01(ERRCNT)) in attributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 6UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentAttributeDgthreadsf02mlecntInAttributeList_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
                                                                                    endpointID:@(0)
                                                                                         queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent attribute (DGTHREAD.S.F02(MLECNT)) in attributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 14UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 15UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 16UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 17UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 18UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 19UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 20UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 21UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentAttributeDgthreadsf03maccntInAttributeList_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
                                                                                    endpointID:@(0)
                                                                                         queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent attribute (DGTHREAD.S.F03(MACCNT)) in attributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 22UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 23UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 24UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 25UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 26UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 27UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 28UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 29UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 30UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 31UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 32UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 33UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 34UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 35UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 36UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 37UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 38UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 39UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 40UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 41UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 42UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 43UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 44UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 45UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 46UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 47UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 48UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 49UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 50UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 51UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 52UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 53UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 54UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 55UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeActiveTimestampInAttributeList_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
                                                                                    endpointID:@(0)
                                                                                         queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute (ActiveTimestamp) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 56UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributePendingTimestampInAttributeList_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
                                                                                    endpointID:@(0)
                                                                                         queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute (PendingTimestamp) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 57UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeDelayInAttributeList_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
                                                                                    endpointID:@(0)
                                                                                         queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute (Delay) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 58UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAcceptedCommandListFromDut_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
                                                                                    endpointID:@(0)
                                                                                         queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AcceptedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsGeneratedCommandListFromDut_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
                                                                                    endpointID:@(0)
                                                                                         queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads GeneratedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_ULABEL_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_ULABEL_1_1()
        : TestCommandBridge("Test_TC_ULABEL_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_ULABEL_1_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_ULABEL_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_ULABEL_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the global attribute: FeatureMap\n");
            err = TestReadTheGlobalAttributeFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_5();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 6;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: ClusterRevision Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: FeatureMap Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the global attribute: GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_ULABEL_2_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_ULABEL_2_1()
        : TestCommandBridge("Test_TC_ULABEL_2_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_ULABEL_2_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_ULABEL_2_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_ULABEL_2_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads LabelList attribute of the DUT\n");
            if (ShouldSkip("ULABEL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsLabelListAttributeOfTheDut_1();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 2;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsLabelListAttributeOfTheDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLabelListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads LabelList attribute of the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("labelList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_ULABEL_2_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_ULABEL_2_2()
        : TestCommandBridge("Test_TC_ULABEL_2_2")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_ULABEL_2_2() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_ULABEL_2_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_ULABEL_2_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH writes LabelList attribute from the DUT\n");
            if (ShouldSkip("ULABEL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThWritesLabelListAttributeFromTheDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads LabelList attribute from the DUT\n");
            if (ShouldSkip("ULABEL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsLabelListAttributeFromTheDut_2();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 3;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThWritesLabelListAttributeFromTheDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id labelListArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRUserLabelClusterLabelStruct alloc] init];
            ((MTRUserLabelClusterLabelStruct *) temp_0[0]).label = @"roomName";
            ((MTRUserLabelClusterLabelStruct *) temp_0[0]).value = @"master bedroom 1";

            temp_0[1] = [[MTRUserLabelClusterLabelStruct alloc] init];
            ((MTRUserLabelClusterLabelStruct *) temp_0[1]).label = @"Orientation";
            ((MTRUserLabelClusterLabelStruct *) temp_0[1]).value = @"east";

            temp_0[2] = [[MTRUserLabelClusterLabelStruct alloc] init];
            ((MTRUserLabelClusterLabelStruct *) temp_0[2]).label = @"floor";
            ((MTRUserLabelClusterLabelStruct *) temp_0[2]).value = @"2";

            temp_0[3] = [[MTRUserLabelClusterLabelStruct alloc] init];
            ((MTRUserLabelClusterLabelStruct *) temp_0[3]).label = @"roomType";
            ((MTRUserLabelClusterLabelStruct *) temp_0[3]).value = @"bedroom";

            labelListArgument = temp_0;
        }
        [cluster writeAttributeLabelListWithValue:labelListArgument
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(@"TH writes LabelList attribute from the DUT Error: %@", err);

                                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsLabelListAttributeFromTheDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLabelListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads LabelList attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("LabelList", [actualValue count], static_cast<uint32_t>(4)));
                VerifyOrReturn(CheckValueAsString("Label", ((MTRUserLabelClusterLabelStruct *) actualValue[0]).label, @"roomName"));
                VerifyOrReturn(
                    CheckValueAsString("Value", ((MTRUserLabelClusterLabelStruct *) actualValue[0]).value, @"master bedroom 1"));
                VerifyOrReturn(
                    CheckValueAsString("Label", ((MTRUserLabelClusterLabelStruct *) actualValue[1]).label, @"Orientation"));
                VerifyOrReturn(CheckValueAsString("Value", ((MTRUserLabelClusterLabelStruct *) actualValue[1]).value, @"east"));
                VerifyOrReturn(CheckValueAsString("Label", ((MTRUserLabelClusterLabelStruct *) actualValue[2]).label, @"floor"));
                VerifyOrReturn(CheckValueAsString("Value", ((MTRUserLabelClusterLabelStruct *) actualValue[2]).value, @"2"));
                VerifyOrReturn(CheckValueAsString("Label", ((MTRUserLabelClusterLabelStruct *) actualValue[3]).label, @"roomType"));
                VerifyOrReturn(CheckValueAsString("Value", ((MTRUserLabelClusterLabelStruct *) actualValue[3]).value, @"bedroom"));
            }

            VerifyOrReturn(CheckConstraintType("labelList", "list", "list"));
            VerifyOrReturn(CheckConstraintMinLength("labelList", value, 4));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_ULABEL_2_3 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_ULABEL_2_3()
        : TestCommandBridge("Test_TC_ULABEL_2_3")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_ULABEL_2_3() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_ULABEL_2_3\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_ULABEL_2_3\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH writes LabelList attribute of the DUT\n");
            if (ShouldSkip("ULABEL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThWritesLabelListAttributeOfTheDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH writes LabelList attribute of the DUT\n");
            if (ShouldSkip("ULABEL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThWritesLabelListAttributeOfTheDut_2();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 3;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThWritesLabelListAttributeOfTheDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id labelListArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRUserLabelClusterLabelStruct alloc] init];
            ((MTRUserLabelClusterLabelStruct *) temp_0[0]).label = @"room";
            ((MTRUserLabelClusterLabelStruct *) temp_0[0]).value = @"17_bytesIsTooLongforuserlabelnotexpected";

            labelListArgument = temp_0;
        }
        [cluster
            writeAttributeLabelListWithValue:labelListArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"TH writes LabelList attribute of the DUT Error: %@", err);

                                      VerifyOrReturn(CheckValue("status",
                                          err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                        : EMBER_ZCL_STATUS_FAILURE)
                                              : 0,
                                          EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesLabelListAttributeOfTheDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id labelListArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRUserLabelClusterLabelStruct alloc] init];
            ((MTRUserLabelClusterLabelStruct *) temp_0[0]).label = @"17_bytesIsTooLongforuserlabelnotexpected";
            ((MTRUserLabelClusterLabelStruct *) temp_0[0]).value = @"foobar";

            labelListArgument = temp_0;
        }
        [cluster
            writeAttributeLabelListWithValue:labelListArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"TH writes LabelList attribute of the DUT Error: %@", err);

                                      VerifyOrReturn(CheckValue("status",
                                          err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                        : EMBER_ZCL_STATUS_FAILURE)
                                              : 0,
                                          EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_ULABEL_2_4 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_ULABEL_2_4()
        : TestCommandBridge("Test_TC_ULABEL_2_4")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_ULABEL_2_4() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_ULABEL_2_4\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_ULABEL_2_4\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH writes LabelList attribute of the DUT\n");
            if (ShouldSkip("ULABEL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThWritesLabelListAttributeOfTheDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads LabelList attribute of the DUT\n");
            if (ShouldSkip("ULABEL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsLabelListAttributeOfTheDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : TH writes LabelList attribute of the DUT\n");
            if (ShouldSkip("ULABEL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThWritesLabelListAttributeOfTheDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH reads LabelList attribute of the DUT\n");
            if (ShouldSkip("ULABEL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsLabelListAttributeOfTheDut_4();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 5;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThWritesLabelListAttributeOfTheDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id labelListArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRUserLabelClusterLabelStruct alloc] init];
            ((MTRUserLabelClusterLabelStruct *) temp_0[0]).label = @"room";
            ((MTRUserLabelClusterLabelStruct *) temp_0[0]).value = @"bedroom 1";

            temp_0[1] = [[MTRUserLabelClusterLabelStruct alloc] init];
            ((MTRUserLabelClusterLabelStruct *) temp_0[1]).label = @"Orientation";
            ((MTRUserLabelClusterLabelStruct *) temp_0[1]).value = @"east";

            labelListArgument = temp_0;
        }
        [cluster writeAttributeLabelListWithValue:labelListArgument
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(@"TH writes LabelList attribute of the DUT Error: %@", err);

                                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsLabelListAttributeOfTheDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLabelListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads LabelList attribute of the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("LabelList", [actualValue count], static_cast<uint32_t>(2)));
                VerifyOrReturn(CheckValueAsString("Label", ((MTRUserLabelClusterLabelStruct *) actualValue[0]).label, @"room"));
                VerifyOrReturn(
                    CheckValueAsString("Value", ((MTRUserLabelClusterLabelStruct *) actualValue[0]).value, @"bedroom 1"));
                VerifyOrReturn(
                    CheckValueAsString("Label", ((MTRUserLabelClusterLabelStruct *) actualValue[1]).label, @"Orientation"));
                VerifyOrReturn(CheckValueAsString("Value", ((MTRUserLabelClusterLabelStruct *) actualValue[1]).value, @"east"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesLabelListAttributeOfTheDut_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id labelListArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRUserLabelClusterLabelStruct alloc] init];
            ((MTRUserLabelClusterLabelStruct *) temp_0[0]).label = @"";
            ((MTRUserLabelClusterLabelStruct *) temp_0[0]).value = @"";

            labelListArgument = temp_0;
        }
        [cluster writeAttributeLabelListWithValue:labelListArgument
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(@"TH writes LabelList attribute of the DUT Error: %@", err);

                                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsLabelListAttributeOfTheDut_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLabelListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads LabelList attribute of the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("LabelList", [actualValue count], static_cast<uint32_t>(1)));
                VerifyOrReturn(CheckValueAsString("Label", ((MTRUserLabelClusterLabelStruct *) actualValue[0]).label, @""));
                VerifyOrReturn(CheckValueAsString("Value", ((MTRUserLabelClusterLabelStruct *) actualValue[0]).value, @""));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGWIFI_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_DGWIFI_1_1()
        : TestCommandBridge("Test_TC_DGWIFI_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_DGWIFI_1_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_DGWIFI_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_DGWIFI_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads the ClusterRevision from DUT\n");
            err = TestThReadsTheClusterRevisionFromDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads the FeatureMap from DUT\n");
            if (ShouldSkip("( !DGWIFI.S.F00 && !DGWIFI.S.F01 )")) {
                NextTest();
                return;
            }
            err = TestThReadsTheFeatureMapFromDut_2();
            break;
        case 3:
            ChipLogProgress(
                chipTool, " ***** Test Step 3 : Given DGWIFI.S.F00(PacketCounts) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("DGWIFI.S.F00")) {
                NextTest();
                return;
            }
            err = TestGivenDGWIFISF00PacketCountsEnsureFeaturemapHasTheCorrectBitSet_3();
            break;
        case 4:
            ChipLogProgress(
                chipTool, " ***** Test Step 4 : Given DGWIFI.S.F01(ErrorCounts) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("DGWIFI.S.F01")) {
                NextTest();
                return;
            }
            err = TestGivenDGWIFISF01ErrorCountsEnsureFeaturemapHasTheCorrectBitSet_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH reads AttributeList from DUT\n");
            err = TestThReadsAttributeListFromDut_5();
            break;
        case 6:
            ChipLogProgress(
                chipTool, " ***** Test Step 6 : TH reads Feature dependent(DGWIFI.S.F00) attributes in attributeList from DUT\n");
            if (ShouldSkip("DGWIFI.S.F00")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentDGWIFISF00AttributesInAttributeListFromDut_6();
            break;
        case 7:
            ChipLogProgress(
                chipTool, " ***** Test Step 7 : TH reads Feature dependent(DGWIFI.S.F01) attributes in attributeList from DUT\n");
            if (ShouldSkip("DGWIFI.S.F01")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentDGWIFISF01AttributesInAttributeListFromDut_7();
            break;
        case 8:
            ChipLogProgress(
                chipTool, " ***** Test Step 8 : TH reads optional attribute (CurrentMaxRate) in AttributeList from DUT\n");
            if (ShouldSkip("DGWIFI.S.A000b")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeCurrentMaxRateInAttributeListFromDut_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH reads AcceptedCommandList from DUT\n");
            if (ShouldSkip(" !DGWIFI.S.F01 ")) {
                NextTest();
                return;
            }
            err = TestThReadsAcceptedCommandListFromDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool,
                " ***** Test Step 10 : TH reads Feature dependent(DGWIFI.S.F01) command in AcceptedCommandList from DUT\n");
            if (ShouldSkip("DGWIFI.S.F01")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentDGWIFISF01CommandInAcceptedCommandListFromDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : TH reads GeneratedCommandList from DUT\n");
            err = TestThReadsGeneratedCommandListFromDut_11();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 12;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheClusterRevisionFromDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the ClusterRevision from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheFeatureMapFromDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the FeatureMap from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenDGWIFISF00PacketCountsEnsureFeaturemapHasTheCorrectBitSet_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given DGWIFI.S.F00(PacketCounts) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenDGWIFISF01ErrorCountsEnsureFeaturemapHasTheCorrectBitSet_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given DGWIFI.S.F01(ErrorCounts) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAttributeListFromDut_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AttributeList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 3UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 4UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentDGWIFISF00AttributesInAttributeListFromDut_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent(DGWIFI.S.F00) attributes in attributeList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 6UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 7UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 8UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 9UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 10UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentDGWIFISF01AttributesInAttributeListFromDut_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent(DGWIFI.S.F01) attributes in attributeList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 5UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 12UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeCurrentMaxRateInAttributeListFromDut_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute (CurrentMaxRate) in AttributeList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 11UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAcceptedCommandListFromDut_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AcceptedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentDGWIFISF01CommandInAcceptedCommandListFromDut_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent(DGWIFI.S.F01) command in AcceptedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsGeneratedCommandListFromDut_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads GeneratedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGWIFI_2_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_DGWIFI_2_1()
        : TestCommandBridge("Test_TC_DGWIFI_2_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_DGWIFI_2_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_DGWIFI_2_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_DGWIFI_2_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads BSSID attribute from DUT\n");
            if (ShouldSkip("DGWIFI.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsBssidAttributeFromDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Reads SecurityType attribute constraints\n");
            if (ShouldSkip("DGWIFI.S.A0001")) {
                NextTest();
                return;
            }
            err = TestReadsSecurityTypeAttributeConstraints_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Reads WiFiVersion attribute constraints\n");
            if (ShouldSkip("DGWIFI.S.A0002")) {
                NextTest();
                return;
            }
            err = TestReadsWiFiVersionAttributeConstraints_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Reads ChannelNumber attribute constraints\n");
            if (ShouldSkip("DGWIFI.S.A0003")) {
                NextTest();
                return;
            }
            err = TestReadsChannelNumberAttributeConstraints_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Reads RSSI attribute constraints\n");
            if (ShouldSkip("DGWIFI.S.A0004")) {
                NextTest();
                return;
            }
            err = TestReadsRssiAttributeConstraints_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Reads BeaconLostCount attribute constraints\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.A0005")) {
                NextTest();
                return;
            }
            err = TestReadsBeaconLostCountAttributeConstraints_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Reads BeaconRxCount attribute constraints\n");
            if (ShouldSkip("DGWIFI.S.A0006")) {
                NextTest();
                return;
            }
            err = TestReadsBeaconRxCountAttributeConstraints_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Reads PacketMulticastRxCount attribute constraints\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.A0007")) {
                NextTest();
                return;
            }
            err = TestReadsPacketMulticastRxCountAttributeConstraints_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Reads PacketMulticastTxCount attribute constraints\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.A0008")) {
                NextTest();
                return;
            }
            err = TestReadsPacketMulticastTxCountAttributeConstraints_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Reads PacketUnicastRxCount attribute constraints\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.A0009")) {
                NextTest();
                return;
            }
            err = TestReadsPacketUnicastRxCountAttributeConstraints_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Reads PacketUnicastTxCount attribute constraints\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.A000a")) {
                NextTest();
                return;
            }
            err = TestReadsPacketUnicastTxCountAttributeConstraints_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Reads CurrentMaxRate attribute constraints\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.A000b")) {
                NextTest();
                return;
            }
            err = TestReadsCurrentMaxRateAttributeConstraints_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Reads OverrunCount attribute constraints\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.A000c")) {
                NextTest();
                return;
            }
            err = TestReadsOverrunCountAttributeConstraints_13();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 14;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsBssidAttributeFromDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBSSIDWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads BSSID attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("bssid", "octet_string", "octet_string"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsSecurityTypeAttributeConstraints_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSecurityTypeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads SecurityType attribute constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("securityType", "enum8", "enum8"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsWiFiVersionAttributeConstraints_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeWiFiVersionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads WiFiVersion attribute constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("wiFiVersion", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("wiFiVersion", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("wiFiVersion", [value unsignedCharValue], 5U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsChannelNumberAttributeConstraints_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeChannelNumberWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads ChannelNumber attribute constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("channelNumber", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("channelNumber", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("channelNumber", [value unsignedShortValue], 65535U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsRssiAttributeConstraints_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRSSIWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads RSSI attribute constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("rssi", "int8s", "int8s"));
                VerifyOrReturn(CheckConstraintMinValue<int8_t>("rssi", [value charValue], -120));
                VerifyOrReturn(CheckConstraintMaxValue<int8_t>("rssi", [value charValue], 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsBeaconLostCountAttributeConstraints_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBeaconLostCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads BeaconLostCount attribute constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("beaconLostCount", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue<uint32_t>("beaconLostCount", [value unsignedIntValue], 0UL));
                VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("beaconLostCount", [value unsignedIntValue], 4294967295UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsBeaconRxCountAttributeConstraints_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBeaconRxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads BeaconRxCount attribute constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("beaconRxCount", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue<uint32_t>("beaconRxCount", [value unsignedIntValue], 0UL));
                VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("beaconRxCount", [value unsignedIntValue], 4294967295UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsPacketMulticastRxCountAttributeConstraints_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePacketMulticastRxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads PacketMulticastRxCount attribute constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("packetMulticastRxCount", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue<uint32_t>("packetMulticastRxCount", [value unsignedIntValue], 0UL));
                VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("packetMulticastRxCount", [value unsignedIntValue], 4294967295UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsPacketMulticastTxCountAttributeConstraints_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePacketMulticastTxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads PacketMulticastTxCount attribute constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("packetMulticastTxCount", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue<uint32_t>("packetMulticastTxCount", [value unsignedIntValue], 0UL));
                VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("packetMulticastTxCount", [value unsignedIntValue], 4294967295UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsPacketUnicastRxCountAttributeConstraints_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePacketUnicastRxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads PacketUnicastRxCount attribute constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("packetUnicastRxCount", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue<uint32_t>("packetUnicastRxCount", [value unsignedIntValue], 0UL));
                VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("packetUnicastRxCount", [value unsignedIntValue], 4294967295UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsPacketUnicastTxCountAttributeConstraints_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePacketUnicastTxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads PacketUnicastTxCount attribute constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("packetUnicastTxCount", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue<uint32_t>("packetUnicastTxCount", [value unsignedIntValue], 0UL));
                VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("packetUnicastTxCount", [value unsignedIntValue], 4294967295UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsCurrentMaxRateAttributeConstraints_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentMaxRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads CurrentMaxRate attribute constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("currentMaxRate", "int64u", "int64u"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsOverrunCountAttributeConstraints_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOverrunCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads OverrunCount attribute constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("overrunCount", "int64u", "int64u"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGWIFI_2_3 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_DGWIFI_2_3()
        : TestCommandBridge("Test_TC_DGWIFI_2_3")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_DGWIFI_2_3() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_DGWIFI_2_3\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_DGWIFI_2_3\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH sends ResetCounts command to DUT\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsResetCountsCommandToDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Reads BeaconLostCount attribute from DUT\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.C00.Rsp && DGWIFI.S.A0005")) {
                NextTest();
                return;
            }
            err = TestReadsBeaconLostCountAttributeFromDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Reads BeaconRxCount attribute from DUT\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.C00.Rsp && DGWIFI.S.A0006")) {
                NextTest();
                return;
            }
            err = TestReadsBeaconRxCountAttributeFromDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Reads PacketMulticastRxCount attribute from DUT\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.C00.Rsp && DGWIFI.S.A0007")) {
                NextTest();
                return;
            }
            err = TestReadsPacketMulticastRxCountAttributeFromDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Reads PacketMulticastTxCount attribute from DUT\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.C00.Rsp && DGWIFI.S.A0008")) {
                NextTest();
                return;
            }
            err = TestReadsPacketMulticastTxCountAttributeFromDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Reads PacketUnicastRxCount attribute from DUT\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.C00.Rsp && DGWIFI.S.A0009")) {
                NextTest();
                return;
            }
            err = TestReadsPacketUnicastRxCountAttributeFromDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Reads PacketUnicastTxCount attribute from DUT\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP && DGWIFI.S.C00.Rsp && DGWIFI.S.A000a")) {
                NextTest();
                return;
            }
            err = TestReadsPacketUnicastTxCountAttributeFromDut_7();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 8;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThSendsResetCountsCommandToDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster resetCountsWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"TH sends ResetCounts command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsBeaconLostCountAttributeFromDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBeaconLostCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads BeaconLostCount attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("beaconLostCount", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue<uint32_t>("beaconLostCount", [value unsignedIntValue], 0UL));
                VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("beaconLostCount", [value unsignedIntValue], 4294967295UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsBeaconRxCountAttributeFromDut_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBeaconRxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads BeaconRxCount attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("beaconRxCount", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue<uint32_t>("beaconRxCount", [value unsignedIntValue], 0UL));
                VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("beaconRxCount", [value unsignedIntValue], 4294967295UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsPacketMulticastRxCountAttributeFromDut_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePacketMulticastRxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads PacketMulticastRxCount attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("packetMulticastRxCount", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue<uint32_t>("packetMulticastRxCount", [value unsignedIntValue], 0UL));
                VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("packetMulticastRxCount", [value unsignedIntValue], 4294967295UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsPacketMulticastTxCountAttributeFromDut_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePacketMulticastTxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads PacketMulticastTxCount attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("packetMulticastTxCount", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue<uint32_t>("packetMulticastTxCount", [value unsignedIntValue], 0UL));
                VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("packetMulticastTxCount", [value unsignedIntValue], 4294967295UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsPacketUnicastRxCountAttributeFromDut_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePacketUnicastRxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads PacketUnicastRxCount attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("packetUnicastRxCount", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue<uint32_t>("packetUnicastRxCount", [value unsignedIntValue], 0UL));
                VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("packetUnicastRxCount", [value unsignedIntValue], 4294967295UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsPacketUnicastTxCountAttributeFromDut_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePacketUnicastTxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads PacketUnicastTxCount attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("packetUnicastTxCount", "int32u", "int32u"));
                VerifyOrReturn(CheckConstraintMinValue<uint32_t>("packetUnicastTxCount", [value unsignedIntValue], 0UL));
                VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("packetUnicastTxCount", [value unsignedIntValue], 4294967295UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_WNCV_1_1()
        : TestCommandBridge("Test_TC_WNCV_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_WNCV_1_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_WNCV_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_WNCV_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads from the DUT the (0xFFFD) ClusterRevision attribute\n");
            if (ShouldSkip("WNCV.S.Afffd")) {
                NextTest();
                return;
            }
            err = TestThReadsFromTheDutThe0xFFFDClusterRevisionAttribute_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads from the DUT the (0xFFFC) FeatureMap attribute\n");
            if (ShouldSkip(" WNCV.S.Afffc && !WNCV.S.F00 && !WNCV.S.F01 && !WNCV.S.F02 && !WNCV.S.F03 && !WNCV.S.F04 ")) {
                NextTest();
                return;
            }
            err = TestThReadsFromTheDutThe0xFFFCFeatureMapAttribute_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Given WNCV.S.F00(LF) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("WNCV.S.F00")) {
                NextTest();
                return;
            }
            err = TestGivenWncvsf00lfEnsureFeaturemapHasTheCorrectBitSet_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Given  WNCV.S.F01(TL) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("WNCV.S.F01")) {
                NextTest();
                return;
            }
            err = TestGivenWncvsf01tlEnsureFeaturemapHasTheCorrectBitSet_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Given WNCV.S.F02(PA_LF) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("WNCV.S.F02")) {
                NextTest();
                return;
            }
            err = TestGivenWncvsf02paLfEnsureFeaturemapHasTheCorrectBitSet_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Given WNCV.S.F03(ABS) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("WNCV.S.F03")) {
                NextTest();
                return;
            }
            err = TestGivenWncvsf03absEnsureFeaturemapHasTheCorrectBitSet_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Given WNCV.S.F04(PA_TL) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("WNCV.S.F04")) {
                NextTest();
                return;
            }
            err = TestGivenWncvsf04paTlEnsureFeaturemapHasTheCorrectBitSet_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : TH reads from the DUT the (0xFFFB) AttributeList attribute\n");
            if (ShouldSkip("WNCV.S.Afffb")) {
                NextTest();
                return;
            }
            err = TestThReadsFromTheDutThe0xFFFBAttributeListAttribute_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH reads optional attribute(SafetyStatus) in AttributeList\n");
            if (ShouldSkip("WNCV.S.Afffb && WNCV.S.A001a")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeSafetyStatusInAttributeList_9();
            break;
        case 10:
            ChipLogProgress(chipTool,
                " ***** Test Step 10 : Read the Feature dependent(WNCV.S.F00 & WNCV.S.F02 & WNCV.S.F03) attribute in "
                "AttributeList\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.F03 && WNCV.S.Afffb")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentWNCVSF00Wncvsf02Wncvsf03AttributeInAttributeList_10();
            break;
        case 11:
            ChipLogProgress(chipTool,
                " ***** Test Step 11 : Read the Feature dependent(WNCV.S.F00 & WNCV.S.F02 ) attribute in AttributeList\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.Afffb")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentWNCVSF00Wncvsf02AttributeInAttributeList_11();
            break;
        case 12:
            ChipLogProgress(chipTool,
                " ***** Test Step 12 : Read the Feature dependent(WNCV.S.F01 & WNCV.S.F04 & WNCV.S.F03) attribute in "
                "AttributeList\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.F03 && WNCV.S.Afffb")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentWNCVSF01Wncvsf04Wncvsf03AttributeInAttributeList_12();
            break;
        case 13:
            ChipLogProgress(chipTool,
                " ***** Test Step 13 : Read the Feature dependent(WNCV.S.F01 & WNCV.S.F04 ) attribute in AttributeList\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.Afffb")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentWNCVSF01Wncvsf04AttributeInAttributeList_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : TH reads from the DUT the (0xFFF9) AcceptedCommandList attribute\n");
            if (ShouldSkip("WNCV.S.Afff9")) {
                NextTest();
                return;
            }
            err = TestThReadsFromTheDutThe0xFFF9AcceptedCommandListAttribute_14();
            break;
        case 15:
            ChipLogProgress(chipTool,
                " ***** Test Step 15 : TH reads Feature dependent(WNCV.S.F00 & WNCV.S.F02) command in AcceptedCommandList\n");
            if (ShouldSkip("WNCV.S.Afff9 && WNCV.S.F00 && WNCV.S.F02")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentWNCVSF00Wncvsf02CommandInAcceptedCommandList_15();
            break;
        case 16:
            ChipLogProgress(chipTool,
                " ***** Test Step 16 : TH reads Feature dependent(WNCV.S.F01 & WNCV.S.F03) command in AcceptedCommandList\n");
            if (ShouldSkip("WNCV.S.Afff9 && WNCV.S.F01 && WNCV.S.F03")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentWNCVSF01Wncvsf03CommandInAcceptedCommandList_16();
            break;
        case 17:
            ChipLogProgress(chipTool,
                " ***** Test Step 17 : TH reads Feature dependent(WNCV.S.F01 & WNCV.S.F04) command in AcceptedCommandList\n");
            if (ShouldSkip("WNCV.S.Afff9 && WNCV.S.F01 && WNCV.S.F04")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentWNCVSF01Wncvsf04CommandInAcceptedCommandList_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : TH reads from the DUT the (0xFFF8) GeneratedCommandList attribute\n");
            if (ShouldSkip("WNCV.S.Afff8")) {
                NextTest();
                return;
            }
            err = TestThReadsFromTheDutThe0xFFF8GeneratedCommandListAttribute_18();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 19;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsFromTheDutThe0xFFFDClusterRevisionAttribute_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads from the DUT the (0xFFFD) ClusterRevision attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 5U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("clusterRevision", [value unsignedShortValue], 5U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("clusterRevision", [value unsignedShortValue], 200U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFromTheDutThe0xFFFCFeatureMapAttribute_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads from the DUT the (0xFFFC) FeatureMap attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenWncvsf00lfEnsureFeaturemapHasTheCorrectBitSet_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given WNCV.S.F00(LF) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenWncvsf01tlEnsureFeaturemapHasTheCorrectBitSet_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given  WNCV.S.F01(TL) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenWncvsf02paLfEnsureFeaturemapHasTheCorrectBitSet_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given WNCV.S.F02(PA_LF) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenWncvsf03absEnsureFeaturemapHasTheCorrectBitSet_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given WNCV.S.F03(ABS) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenWncvsf04paTlEnsureFeaturemapHasTheCorrectBitSet_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given WNCV.S.F04(PA_TL) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFromTheDutThe0xFFFBAttributeListAttribute_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads from the DUT the (0xFFFB) AttributeList attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 7UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 10UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 13UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 23UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeSafetyStatusInAttributeList_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(SafetyStatus) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 26UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheFeatureDependentWNCVSF00Wncvsf02Wncvsf03AttributeInAttributeList_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the Feature dependent(WNCV.S.F00 & WNCV.S.F02 & WNCV.S.F03) attribute in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 16UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 17UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheFeatureDependentWNCVSF00Wncvsf02AttributeInAttributeList_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the Feature dependent(WNCV.S.F00 & WNCV.S.F02 ) attribute in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 11UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 14UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheFeatureDependentWNCVSF01Wncvsf04Wncvsf03AttributeInAttributeList_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the Feature dependent(WNCV.S.F01 & WNCV.S.F04 & WNCV.S.F03) attribute in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 18UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 19UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheFeatureDependentWNCVSF01Wncvsf04AttributeInAttributeList_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the Feature dependent(WNCV.S.F01 & WNCV.S.F04 ) attribute in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 12UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 15UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFromTheDutThe0xFFF9AcceptedCommandListAttribute_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads from the DUT the (0xFFF9) AcceptedCommandList attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 2UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentWNCVSF00Wncvsf02CommandInAcceptedCommandList_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent(WNCV.S.F00 & WNCV.S.F02) command in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 5UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentWNCVSF01Wncvsf03CommandInAcceptedCommandList_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent(WNCV.S.F01 & WNCV.S.F03) command in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 7UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentWNCVSF01Wncvsf04CommandInAcceptedCommandList_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent(WNCV.S.F01 & WNCV.S.F04) command in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 8UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFromTheDutThe0xFFF8GeneratedCommandListAttribute_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads from the DUT the (0xFFF8) GeneratedCommandList attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_2_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_WNCV_2_1()
        : TestCommandBridge("Test_TC_WNCV_2_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_WNCV_2_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_WNCV_2_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_WNCV_2_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : 1a: read the RO mandatory attribute default: Type\n");
            if (ShouldSkip("WNCV.S.A0000")) {
                NextTest();
                return;
            }
            err = Test1aReadTheRoMandatoryAttributeDefaultType_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : 1b: read the RO mandatory attribute default: ConfigStatus\n");
            if (ShouldSkip("WNCV.S.A0007")) {
                NextTest();
                return;
            }
            err = Test1bReadTheRoMandatoryAttributeDefaultConfigStatus_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : 1c: read the RO mandatory attribute default: OperationalStatus\n");
            if (ShouldSkip("WNCV.S.A000a")) {
                NextTest();
                return;
            }
            err = Test1cReadTheRoMandatoryAttributeDefaultOperationalStatus_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : 1d: read the RO mandatory attribute default: EndProductType\n");
            if (ShouldSkip("WNCV.S.A000d")) {
                NextTest();
                return;
            }
            err = Test1dReadTheRoMandatoryAttributeDefaultEndProductType_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : 1e: read the RW mandatory attribute default: Mode\n");
            if (ShouldSkip("WNCV.S.A0017")) {
                NextTest();
                return;
            }
            err = Test1eReadTheRwMandatoryAttributeDefaultMode_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : 1f: write a value into the RW mandatory attribute:: Mode\n");
            if (ShouldSkip("WNCV.S.A0017")) {
                NextTest();
                return;
            }
            err = Test1fWriteAValueIntoTheRwMandatoryAttributeMode_6();
            break;
        case 7:
            ChipLogProgress(
                chipTool, " ***** Test Step 7 : 2a: read the RO optional attribute default: TargetPositionLiftPercent100ths\n");
            if (ShouldSkip("WNCV.S.A000b")) {
                NextTest();
                return;
            }
            err = Test2aReadTheRoOptionalAttributeDefaultTargetPositionLiftPercent100ths_7();
            break;
        case 8:
            ChipLogProgress(
                chipTool, " ***** Test Step 8 : 2b: read the RO optional attribute default: TargetPositionTiltPercent100ths\n");
            if (ShouldSkip("WNCV.S.A000c")) {
                NextTest();
                return;
            }
            err = Test2bReadTheRoOptionalAttributeDefaultTargetPositionTiltPercent100ths_8();
            break;
        case 9:
            ChipLogProgress(
                chipTool, " ***** Test Step 9 : 2c: read the RO optional attribute default: CurrentPositionLiftPercent100ths\n");
            if (ShouldSkip("WNCV.S.A000e")) {
                NextTest();
                return;
            }
            err = Test2cReadTheRoOptionalAttributeDefaultCurrentPositionLiftPercent100ths_9();
            break;
        case 10:
            ChipLogProgress(
                chipTool, " ***** Test Step 10 : 2d: read the RO optional attribute default: CurrentPositionTiltPercent100ths\n");
            if (ShouldSkip("WNCV.S.A000f")) {
                NextTest();
                return;
            }
            err = Test2dReadTheRoOptionalAttributeDefaultCurrentPositionTiltPercent100ths_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : 2e: read the RO optional attribute default: InstalledOpenLimitLift\n");
            if (ShouldSkip("WNCV.S.A0010")) {
                NextTest();
                return;
            }
            err = Test2eReadTheRoOptionalAttributeDefaultInstalledOpenLimitLift_11();
            break;
        case 12:
            ChipLogProgress(
                chipTool, " ***** Test Step 12 : 2f: read the RO optional attribute default: InstalledClosedLimitLift\n");
            if (ShouldSkip("WNCV.S.A0011")) {
                NextTest();
                return;
            }
            err = Test2fReadTheRoOptionalAttributeDefaultInstalledClosedLimitLift_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : 2g: read the RO optional attribute default: InstalledOpenLimitTilt\n");
            if (ShouldSkip("WNCV.S.A0012")) {
                NextTest();
                return;
            }
            err = Test2gReadTheRoOptionalAttributeDefaultInstalledOpenLimitTilt_13();
            break;
        case 14:
            ChipLogProgress(
                chipTool, " ***** Test Step 14 : 2h: read the RO optional attribute default: InstalledClosedLimitTilt\n");
            if (ShouldSkip("WNCV.S.A0013")) {
                NextTest();
                return;
            }
            err = Test2hReadTheRoOptionalAttributeDefaultInstalledClosedLimitTilt_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : 3a: read the RO mandatory attribute default: SafetyStatus\n");
            if (ShouldSkip("WNCV.S.A001a")) {
                NextTest();
                return;
            }
            err = Test3aReadTheRoMandatoryAttributeDefaultSafetyStatus_15();
            break;
        case 16:
            ChipLogProgress(
                chipTool, " ***** Test Step 16 : 3b: read the RO optional attribute default: PhysicalClosedLimitLift\n");
            if (ShouldSkip("WNCV.S.A0001")) {
                NextTest();
                return;
            }
            err = Test3bReadTheRoOptionalAttributeDefaultPhysicalClosedLimitLift_16();
            break;
        case 17:
            ChipLogProgress(
                chipTool, " ***** Test Step 17 : 3c: read the RO optional attribute default: PhysicalClosedLimitTilt\n");
            if (ShouldSkip("WNCV.S.A0002")) {
                NextTest();
                return;
            }
            err = Test3cReadTheRoOptionalAttributeDefaultPhysicalClosedLimitTilt_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : 3d: read the RO optional attribute default: CurrentPositionLift\n");
            if (ShouldSkip("WNCV.S.A0003")) {
                NextTest();
                return;
            }
            err = Test3dReadTheRoOptionalAttributeDefaultCurrentPositionLift_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : 3e: read the RO optional attribute default: CurrentPositionTilt\n");
            if (ShouldSkip("WNCV.S.A0004")) {
                NextTest();
                return;
            }
            err = Test3eReadTheRoOptionalAttributeDefaultCurrentPositionTilt_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : 3f: read the RO optional attribute default: NumberOfActuationsLift\n");
            if (ShouldSkip("WNCV.S.A0005")) {
                NextTest();
                return;
            }
            err = Test3fReadTheRoOptionalAttributeDefaultNumberOfActuationsLift_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : 3g: read the RO optional attribute default: NumberOfActuationsTilt\n");
            if (ShouldSkip("WNCV.S.A0006")) {
                NextTest();
                return;
            }
            err = Test3gReadTheRoOptionalAttributeDefaultNumberOfActuationsTilt_21();
            break;
        case 22:
            ChipLogProgress(
                chipTool, " ***** Test Step 22 : 3h: read the RO optional attribute default: CurrentPositionLiftPercentage\n");
            if (ShouldSkip("WNCV.S.A0008")) {
                NextTest();
                return;
            }
            err = Test3hReadTheRoOptionalAttributeDefaultCurrentPositionLiftPercentage_22();
            break;
        case 23:
            ChipLogProgress(
                chipTool, " ***** Test Step 23 : 3i:read the RO optional attribute default: CurrentPositionTiltPercentage\n");
            if (ShouldSkip("WNCV.S.A0009")) {
                NextTest();
                return;
            }
            err = Test3ireadTheRoOptionalAttributeDefaultCurrentPositionTiltPercentage_23();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 24;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR Test1aReadTheRoMandatoryAttributeDefaultType_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTypeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"1a: read the RO mandatory attribute default: Type Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("type", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("type", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("type", [value unsignedCharValue], 9U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1bReadTheRoMandatoryAttributeDefaultConfigStatus_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeConfigStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"1b: read the RO mandatory attribute default: ConfigStatus Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("configStatus", "bitmap8", "bitmap8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("configStatus", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("configStatus", [value unsignedCharValue], 127U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1cReadTheRoMandatoryAttributeDefaultOperationalStatus_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"1c: read the RO mandatory attribute default: OperationalStatus Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("operationalStatus", "bitmap8", "bitmap8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("operationalStatus", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("operationalStatus", [value unsignedCharValue], 127U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1dReadTheRoMandatoryAttributeDefaultEndProductType_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEndProductTypeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"1d: read the RO mandatory attribute default: EndProductType Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("endProductType", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("endProductType", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("endProductType", [value unsignedCharValue], 23U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1eReadTheRwMandatoryAttributeDefaultMode_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"1e: read the RW mandatory attribute default: Mode Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("mode", "bitmap8", "bitmap8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("mode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("mode", [value unsignedCharValue], 15U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1fWriteAValueIntoTheRwMandatoryAttributeMode_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id modeArgument;
        modeArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeModeWithValue:modeArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"1f: write a value into the RW mandatory attribute:: Mode Error: %@", err);

                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2aReadTheRoOptionalAttributeDefaultTargetPositionLiftPercent100ths_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"2a: read the RO optional attribute default: TargetPositionLiftPercent100ths Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("targetPositionLiftPercent100ths", "Percent100ths", "Percent100ths"));
                VerifyOrReturn(CheckConstraintMinValue<chip::Percent100ths>(
                    "targetPositionLiftPercent100ths", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<chip::Percent100ths>(
                    "targetPositionLiftPercent100ths", [value unsignedShortValue], 10000U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2bReadTheRoOptionalAttributeDefaultTargetPositionTiltPercent100ths_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"2b: read the RO optional attribute default: TargetPositionTiltPercent100ths Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("targetPositionTiltPercent100ths", "Percent100ths", "Percent100ths"));
                VerifyOrReturn(CheckConstraintMinValue<chip::Percent100ths>(
                    "targetPositionTiltPercent100ths", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<chip::Percent100ths>(
                    "targetPositionTiltPercent100ths", [value unsignedShortValue], 10000U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2cReadTheRoOptionalAttributeDefaultCurrentPositionLiftPercent100ths_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"2c: read the RO optional attribute default: CurrentPositionLiftPercent100ths Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                if (value != nil) {

                    VerifyOrReturn(CheckConstraintType("currentPositionLiftPercent100ths", "Percent100ths", "Percent100ths"));
                    VerifyOrReturn(CheckConstraintMinValue<chip::Percent100ths>(
                        "currentPositionLiftPercent100ths", [value unsignedShortValue], 0U));
                    VerifyOrReturn(CheckConstraintMaxValue<chip::Percent100ths>(
                        "currentPositionLiftPercent100ths", [value unsignedShortValue], 10000U));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2dReadTheRoOptionalAttributeDefaultCurrentPositionTiltPercent100ths_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"2d: read the RO optional attribute default: CurrentPositionTiltPercent100ths Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                if (value != nil) {

                    VerifyOrReturn(CheckConstraintType("currentPositionTiltPercent100ths", "Percent100ths", "Percent100ths"));
                    VerifyOrReturn(CheckConstraintMinValue<chip::Percent100ths>(
                        "currentPositionTiltPercent100ths", [value unsignedShortValue], 0U));
                    VerifyOrReturn(CheckConstraintMaxValue<chip::Percent100ths>(
                        "currentPositionTiltPercent100ths", [value unsignedShortValue], 10000U));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2eReadTheRoOptionalAttributeDefaultInstalledOpenLimitLift_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInstalledOpenLimitLiftWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"2e: read the RO optional attribute default: InstalledOpenLimitLift Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("installedOpenLimitLift", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("installedOpenLimitLift", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("installedOpenLimitLift", [value unsignedShortValue], 65535U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2fReadTheRoOptionalAttributeDefaultInstalledClosedLimitLift_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInstalledClosedLimitLiftWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"2f: read the RO optional attribute default: InstalledClosedLimitLift Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("installedClosedLimitLift", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("installedClosedLimitLift", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("installedClosedLimitLift", [value unsignedShortValue], 65535U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2gReadTheRoOptionalAttributeDefaultInstalledOpenLimitTilt_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInstalledOpenLimitTiltWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"2g: read the RO optional attribute default: InstalledOpenLimitTilt Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("installedOpenLimitTilt", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("installedOpenLimitTilt", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("installedOpenLimitTilt", [value unsignedShortValue], 65535U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2hReadTheRoOptionalAttributeDefaultInstalledClosedLimitTilt_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInstalledClosedLimitTiltWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"2h: read the RO optional attribute default: InstalledClosedLimitTilt Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("installedClosedLimitTilt", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("installedClosedLimitTilt", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("installedClosedLimitTilt", [value unsignedShortValue], 65535U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3aReadTheRoMandatoryAttributeDefaultSafetyStatus_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSafetyStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3a: read the RO mandatory attribute default: SafetyStatus Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("safetyStatus", "bitmap16", "bitmap16"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("safetyStatus", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("safetyStatus", [value unsignedShortValue], 2047U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3bReadTheRoOptionalAttributeDefaultPhysicalClosedLimitLift_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePhysicalClosedLimitLiftWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3b: read the RO optional attribute default: PhysicalClosedLimitLift Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("physicalClosedLimitLift", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("physicalClosedLimitLift", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("physicalClosedLimitLift", [value unsignedShortValue], 65535U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3cReadTheRoOptionalAttributeDefaultPhysicalClosedLimitTilt_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePhysicalClosedLimitTiltWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3c: read the RO optional attribute default: PhysicalClosedLimitTilt Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("physicalClosedLimitTilt", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("physicalClosedLimitTilt", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("physicalClosedLimitTilt", [value unsignedShortValue], 65535U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3dReadTheRoOptionalAttributeDefaultCurrentPositionLift_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionLiftWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3d: read the RO optional attribute default: CurrentPositionLift Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("currentPositionLift", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentPositionLift", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentPositionLift", [value unsignedShortValue], 65535U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3eReadTheRoOptionalAttributeDefaultCurrentPositionTilt_19()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionTiltWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3e: read the RO optional attribute default: CurrentPositionTilt Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("currentPositionTilt", "int16u", "int16u"));
                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("currentPositionTilt", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentPositionTilt", [value unsignedShortValue], 65535U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3fReadTheRoOptionalAttributeDefaultNumberOfActuationsLift_20()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNumberOfActuationsLiftWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3f: read the RO optional attribute default: NumberOfActuationsLift Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("numberOfActuationsLift", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("numberOfActuationsLift", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("numberOfActuationsLift", [value unsignedShortValue], 65535U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3gReadTheRoOptionalAttributeDefaultNumberOfActuationsTilt_21()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNumberOfActuationsTiltWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3g: read the RO optional attribute default: NumberOfActuationsTilt Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("numberOfActuationsTilt", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("numberOfActuationsTilt", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("numberOfActuationsTilt", [value unsignedShortValue], 65535U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3hReadTheRoOptionalAttributeDefaultCurrentPositionLiftPercentage_22()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionLiftPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3h: read the RO optional attribute default: CurrentPositionLiftPercentage Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("currentPositionLiftPercentage", "Percent", "Percent"));
                VerifyOrReturn(
                    CheckConstraintMinValue<chip::Percent>("currentPositionLiftPercentage", [value unsignedCharValue], 0U));
                VerifyOrReturn(
                    CheckConstraintMaxValue<chip::Percent>("currentPositionLiftPercentage", [value unsignedCharValue], 100U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3ireadTheRoOptionalAttributeDefaultCurrentPositionTiltPercentage_23()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionTiltPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3i:read the RO optional attribute default: CurrentPositionTiltPercentage Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("currentPositionTiltPercentage", "Percent", "Percent"));
                VerifyOrReturn(
                    CheckConstraintMinValue<chip::Percent>("currentPositionTiltPercentage", [value unsignedCharValue], 0U));
                VerifyOrReturn(
                    CheckConstraintMaxValue<chip::Percent>("currentPositionTiltPercentage", [value unsignedCharValue], 100U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_2_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_WNCV_2_2()
        : TestCommandBridge("Test_TC_WNCV_2_2")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_WNCV_2_2() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_WNCV_2_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_WNCV_2_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool,
                " ***** Test Step 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\n");
            if (ShouldSkip("PICS_USER_PROMPT && WNCV.S.A0007 && WNCV.S.F00 && WNCV.S.F02")) {
                NextTest();
                return;
            }
            err = TestReadsConfigStatusAttributeFromDutIfPaLfValueOfBit3MustBe1bElse0bIfPaTlValueOfBit4MustBe1bElse0b_1();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 2;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadsConfigStatusAttributeFromDutIfPaLfValueOfBit3MustBe1bElse0bIfPaTlValueOfBit4MustBe1bElse0b_1()
    {

        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("alpha", value);
    }
};

class Test_TC_WNCV_2_3 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_WNCV_2_3()
        : TestCommandBridge("Test_TC_WNCV_2_3")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_WNCV_2_3() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_WNCV_2_3\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_WNCV_2_3\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : 1a: TH set the Mode Attribute bit0 of the DUT\n");
            if (ShouldSkip("WNCV.S.M.Reversal && WNCV.S.A0017")) {
                NextTest();
                return;
            }
            err = Test1aThSetTheModeAttributeBit0OfTheDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : 1b: TH reads ConfigStatus attribute from DUT\n");
            if (ShouldSkip("WNCV.S.M.Reversal && WNCV.S.A0007")) {
                NextTest();
                return;
            }
            err = Test1bThReadsConfigStatusAttributeFromDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : 1c: TH clear the Mode Attribute bit0 of the DUT\n");
            if (ShouldSkip("WNCV.S.M.Reversal && WNCV.S.A0017")) {
                NextTest();
                return;
            }
            err = Test1cThClearTheModeAttributeBit0OfTheDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : 1d: TH reads ConfigStatus attribute from DUT\n");
            if (ShouldSkip("WNCV.S.M.Reversal && WNCV.S.A0007")) {
                NextTest();
                return;
            }
            err = Test1dThReadsConfigStatusAttributeFromDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : 2a: TH set the Mode Attribute bit1 of the DUT\n");
            if (ShouldSkip("WNCV.S.M.Calibration && WNCV.S.A0017")) {
                NextTest();
                return;
            }
            err = Test2aThSetTheModeAttributeBit1OfTheDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : 2b: TH reads ConfigStatus attribute from DUT\n");
            if (ShouldSkip("WNCV.S.M.Calibration && WNCV.S.A0007")) {
                NextTest();
                return;
            }
            err = Test2bThReadsConfigStatusAttributeFromDut_6();
            break;
        case 7:
            ChipLogProgress(
                chipTool, " ***** Test Step 7 : 2c: If (ConfigStatus bit0 == 0) TH send DownOrClose command to the DUT\n");
            if (ShouldSkip("WNCV.S.M.Calibration && WNCV.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = Test2cIfConfigStatusBit00ThSendDownOrCloseCommandToTheDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : 2d: TH clear the Mode Attribute bit1 of the DUT\n");
            if (ShouldSkip("WNCV.S.M.Calibration && WNCV.S.A0017")) {
                NextTest();
                return;
            }
            err = Test2dThClearTheModeAttributeBit1OfTheDut_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : 2e: TH reads ConfigStatus attribute from DUT\n");
            if (ShouldSkip("WNCV.S.M.Calibration && WNCV.S.A0007")) {
                NextTest();
                return;
            }
            err = Test2eThReadsConfigStatusAttributeFromDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : 2f: TH reads the Mode Attribute from the DUT\n");
            if (ShouldSkip("WNCV.S.M.Calibration && WNCV.S.A0017")) {
                NextTest();
                return;
            }
            err = Test2fThReadsTheModeAttributeFromTheDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : 2g: TH send DownOrClose command to the DUT\n");
            if (ShouldSkip("WNCV.S.M.Calibration && WNCV.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = Test2gThSendDownOrCloseCommandToTheDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : 3a: TH set the Mode Attribute bit2 of the DUT\n");
            if (ShouldSkip("WNCV.S.M.Maintenance && WNCV.S.A0017")) {
                NextTest();
                return;
            }
            err = Test3aThSetTheModeAttributeBit2OfTheDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : 3b: TH send DownOrClose command to the DUT\n");
            if (ShouldSkip("WNCV.S.M.Maintenance && WNCV.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = Test3bThSendDownOrCloseCommandToTheDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : 3c: TH reads ConfigStatus attribute from DUT\n");
            if (ShouldSkip("WNCV.S.M.Maintenance && WNCV.S.A0007")) {
                NextTest();
                return;
            }
            err = Test3cThReadsConfigStatusAttributeFromDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : 3d: TH clear the Mode Attribute bit2 of the DUT\n");
            if (ShouldSkip("WNCV.S.M.Maintenance && WNCV.S.A0017")) {
                NextTest();
                return;
            }
            err = Test3dThClearTheModeAttributeBit2OfTheDut_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : 3e: TH send DownOrClose command to the DUT\n");
            if (ShouldSkip("WNCV.S.M.Maintenance && WNCV.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = Test3eThSendDownOrCloseCommandToTheDut_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : 3f: TH reads ConfigStatus attribute from DUT\n");
            if (ShouldSkip("WNCV.S.M.Maintenance && WNCV.S.A0007")) {
                NextTest();
                return;
            }
            err = Test3fThReadsConfigStatusAttributeFromDut_17();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 18;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR Test1aThSetTheModeAttributeBit0OfTheDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id modeArgument;
        modeArgument = [NSNumber numberWithUnsignedChar:1U];
        [cluster writeAttributeModeWithValue:modeArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"1a: TH set the Mode Attribute bit0 of the DUT Error: %@", err);

                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1bThReadsConfigStatusAttributeFromDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeConfigStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"1b: TH reads ConfigStatus attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("configStatus", [value unsignedCharValue], 4U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("configStatus", [value unsignedCharValue], 127U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1cThClearTheModeAttributeBit0OfTheDut_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id modeArgument;
        modeArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeModeWithValue:modeArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"1c: TH clear the Mode Attribute bit0 of the DUT Error: %@", err);

                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1dThReadsConfigStatusAttributeFromDut_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeConfigStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"1d: TH reads ConfigStatus attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("configStatus", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("configStatus", [value unsignedCharValue], 127U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2aThSetTheModeAttributeBit1OfTheDut_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id modeArgument;
        modeArgument = [NSNumber numberWithUnsignedChar:2U];
        [cluster writeAttributeModeWithValue:modeArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"2a: TH set the Mode Attribute bit1 of the DUT Error: %@", err);

                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull configStatusValA;

    CHIP_ERROR Test2bThReadsConfigStatusAttributeFromDut_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeConfigStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"2b: TH reads ConfigStatus attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("configStatus", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("configStatus", [value unsignedCharValue], 127U));
            {
                configStatusValA = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2cIfConfigStatusBit00ThSendDownOrCloseCommandToTheDut_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster downOrCloseWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"2c: If (ConfigStatus bit0 == 0) TH send DownOrClose command to the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status",
                err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE) : 0,
                EMBER_ZCL_STATUS_FAILURE));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2dThClearTheModeAttributeBit1OfTheDut_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id modeArgument;
        modeArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeModeWithValue:modeArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"2d: TH clear the Mode Attribute bit1 of the DUT Error: %@", err);

                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2eThReadsConfigStatusAttributeFromDut_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeConfigStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"2e: TH reads ConfigStatus attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("configStatus", [value unsignedCharValue], 1U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("configStatus", [value unsignedCharValue], 127U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2fThReadsTheModeAttributeFromTheDut_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"2f: TH reads the Mode Attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("mode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("mode", [value unsignedCharValue], 127U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2gThSendDownOrCloseCommandToTheDut_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster downOrCloseWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"2g: TH send DownOrClose command to the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3aThSetTheModeAttributeBit2OfTheDut_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id modeArgument;
        modeArgument = [NSNumber numberWithUnsignedChar:4U];
        [cluster writeAttributeModeWithValue:modeArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"3a: TH set the Mode Attribute bit2 of the DUT Error: %@", err);

                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3bThSendDownOrCloseCommandToTheDut_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster downOrCloseWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"3b: TH send DownOrClose command to the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status",
                err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE) : 0,
                EMBER_ZCL_STATUS_BUSY));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull configStatusValB;

    CHIP_ERROR Test3cThReadsConfigStatusAttributeFromDut_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeConfigStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3c: TH reads ConfigStatus attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("configStatus", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("configStatus", [value unsignedCharValue], 127U));
            {
                configStatusValB = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3dThClearTheModeAttributeBit2OfTheDut_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id modeArgument;
        modeArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeModeWithValue:modeArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"3d: TH clear the Mode Attribute bit2 of the DUT Error: %@", err);

                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3eThSendDownOrCloseCommandToTheDut_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster downOrCloseWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"3e: TH send DownOrClose command to the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3fThReadsConfigStatusAttributeFromDut_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeConfigStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3f: TH reads ConfigStatus attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("configStatus", [value unsignedCharValue], 1U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("configStatus", [value unsignedCharValue], 127U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_2_4 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_WNCV_2_4()
        : TestCommandBridge("Test_TC_WNCV_2_4")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_WNCV_2_4() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_WNCV_2_4\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_WNCV_2_4\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Reads Type attribute from DUT\n");
            if (ShouldSkip("PICS_USER_PROMPT && WNCV.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadsTypeAttributeFromDut_1();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 2;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadsTypeAttributeFromDut_1()
    {

        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("alpha", value);
    }
};

class Test_TC_WNCV_2_5 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_WNCV_2_5()
        : TestCommandBridge("Test_TC_WNCV_2_5")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_WNCV_2_5() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_WNCV_2_5\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_WNCV_2_5\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads EndProductType attribute from DUT\n");
            if (ShouldSkip("WNCV.S.A000d")) {
                NextTest();
                return;
            }
            err = TestThReadsEndProductTypeAttributeFromDut_1();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 2;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsEndProductTypeAttributeFromDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEndProductTypeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads EndProductType attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("endProductType", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("endProductType", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("endProductType", [value unsignedCharValue], 23U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_3_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_WNCV_3_1()
        : TestCommandBridge("Test_TC_WNCV_3_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_WNCV_3_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_WNCV_3_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_WNCV_3_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : 0: Wait for the commissioned device to be retrieved\n");
            err = Test0WaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool,
                " ***** Test Step 1 : 1a: TH sends DownOrClose command to preposition the DUT in the opposite direction\n");
            if (ShouldSkip("WNCV.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = Test1aThSendsDownOrCloseCommandToPrepositionTheDutInTheOppositeDirection_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : 1b: TH Waits for 10 seconds movement(s) on the device\n");
            err = Test1bThWaitsFor10SecondsMovementsOnTheDevice_2();
            break;
        case 3:
            ChipLogProgress(
                chipTool, " ***** Test Step 3 : 1c: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e")) {
                NextTest();
                return;
            }
            err = Test1cIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool,
                " ***** Test Step 4 : 1d: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A0008")) {
                NextTest();
                return;
            }
            err = Test1dIfPaLfThReadsCurrentPositionLiftPercentageOptionalAttributeFromDut_4();
            break;
        case 5:
            ChipLogProgress(
                chipTool, " ***** Test Step 5 : 1e: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f")) {
                NextTest();
                return;
            }
            err = Test1eIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool,
                " ***** Test Step 6 : 1f: If (PA & TL) TH reads CurrentPositionTiltPercentage optional attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A0009")) {
                NextTest();
                return;
            }
            err = Test1fIfPaTlThReadsCurrentPositionTiltPercentageOptionalAttributeFromDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Report: 2: Subscribe to DUT reports on OperationalStatus attribute\n");
            err = TestReport2SubscribeToDutReportsOnOperationalStatusAttribute_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : 2: Subscribe to DUT reports on OperationalStatus attribute\n");
            err = Test2SubscribeToDutReportsOnOperationalStatusAttribute_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : 2a: TH sends UpOrOpen command to DUT\n");
            if (ShouldSkip("WNCV.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = Test2aThSendsUpOrOpenCommandToDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : 2b: DUT updates its attributes\n");
            err = Test2bDutUpdatesItsAttributes_10();
            break;
        case 11:
            ChipLogProgress(
                chipTool, " ***** Test Step 11 : 2c: If (PA & LF) TH reads TargetPositionLiftPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000b")) {
                NextTest();
                return;
            }
            err = Test2cIfPaLfThReadsTargetPositionLiftPercent100thsAttributeFromDut_11();
            break;
        case 12:
            ChipLogProgress(
                chipTool, " ***** Test Step 12 : 2d: If (PA & TL) TH reads TargetPositionTiltPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000c")) {
                NextTest();
                return;
            }
            err = Test2dIfPaTlThReadsTargetPositionTiltPercent100thsAttributeFromDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : 2e: TH leave the device moving for 2 seconds\n");
            err = Test2eThLeaveTheDeviceMovingFor2Seconds_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : 3a: TH reads OperationalStatus attribute's bit 0..1\n");
            if (ShouldSkip("WNCV.S.A000a")) {
                NextTest();
                return;
            }
            err = Test3aThReadsOperationalStatusAttributesBit01_14();
            break;
        case 15:
            ChipLogProgress(
                chipTool, " ***** Test Step 15 : 3a: TH reads OperationalStatus attribute's bit 2..3 (WNCV.S.F00(LF))\n");
            if (ShouldSkip("WNCV.S.A000a && WNCV.S.F00")) {
                NextTest();
                return;
            }
            err = Test3aThReadsOperationalStatusAttributesBit23Wncvsf00lf_15();
            break;
        case 16:
            ChipLogProgress(
                chipTool, " ***** Test Step 16 : 3a: TH reads OperationalStatus attribute's bit 2..3 (WNCV.S.F00(LF))\n");
            if (ShouldSkip("WNCV.S.A000a && !WNCV.S.F00")) {
                NextTest();
                return;
            }
            err = Test3aThReadsOperationalStatusAttributesBit23Wncvsf00lf_16();
            break;
        case 17:
            ChipLogProgress(
                chipTool, " ***** Test Step 17 : 3a: TH reads OperationalStatus attribute's bit 4..5 (WNCV.S.F01(TL))\n");
            if (ShouldSkip("WNCV.S.A000a && WNCV.S.F01")) {
                NextTest();
                return;
            }
            err = Test3aThReadsOperationalStatusAttributesBit45Wncvsf01tl_17();
            break;
        case 18:
            ChipLogProgress(
                chipTool, " ***** Test Step 18 : 3a: TH reads OperationalStatus attribute's bit 4..5 (WNCV.S.F01(TL))\n");
            if (ShouldSkip("WNCV.S.A000a && !WNCV.S.F01")) {
                NextTest();
                return;
            }
            err = Test3aThReadsOperationalStatusAttributesBit45Wncvsf01tl_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : 3a2: DUT updates its attributes\n");
            err = Test3a2DutUpdatesItsAttributes_19();
            break;
        case 20:
            ChipLogProgress(
                chipTool, " ***** Test Step 20 : 3b: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e")) {
                NextTest();
                return;
            }
            err = Test3bIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_20();
            break;
        case 21:
            ChipLogProgress(chipTool,
                " ***** Test Step 21 : 3c: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A0008")) {
                NextTest();
                return;
            }
            err = Test3cIfPaLfThReadsCurrentPositionLiftPercentageOptionalAttributeFromDut_21();
            break;
        case 22:
            ChipLogProgress(
                chipTool, " ***** Test Step 22 : 3d: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f")) {
                NextTest();
                return;
            }
            err = Test3dIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_22();
            break;
        case 23:
            ChipLogProgress(chipTool,
                " ***** Test Step 23 : 3e: If (PA & LF) TH reads CurrentPositionTiltPercentage optional attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A0009")) {
                NextTest();
                return;
            }
            err = Test3eIfPaLfThReadsCurrentPositionTiltPercentageOptionalAttributeFromDut_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : 4a: TH sends a StopMotion command to DUT\n");
            if (ShouldSkip("WNCV.S.C02.Rsp")) {
                NextTest();
                return;
            }
            err = Test4aThSendsAStopMotionCommandToDut_24();
            break;
        case 25:
            ChipLogProgress(
                chipTool, " ***** Test Step 25 : 4b: TH waits for 3 seconds the end of inertial movement(s) on the device\n");
            err = Test4bThWaitsFor3SecondsTheEndOfInertialMovementsOnTheDevice_25();
            break;
        case 26:
            ChipLogProgress(
                chipTool, " ***** Test Step 26 : 4c: Verify DUT update OperationalStatus attribute to TH after a StopMotion\n");
            if (ShouldSkip("WNCV.S.A000a")) {
                NextTest();
                return;
            }
            err = Test4cVerifyDutUpdateOperationalStatusAttributeToThAfterAStopMotion_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : 5a: TH waits for x seconds attributes update on the device\n");
            err = Test5aThWaitsForXSecondsAttributesUpdateOnTheDevice_27();
            break;
        case 28:
            ChipLogProgress(
                chipTool, " ***** Test Step 28 : 5b: If (PA & LF) TH reads TargetPositionLiftPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000b")) {
                NextTest();
                return;
            }
            err = Test5bIfPaLfThReadsTargetPositionLiftPercent100thsAttributeFromDut_28();
            break;
        case 29:
            ChipLogProgress(
                chipTool, " ***** Test Step 29 : 5c: If (PA & TL) TH reads TargetPositionTiltPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000c")) {
                NextTest();
                return;
            }
            err = Test5cIfPaTlThReadsTargetPositionTiltPercent100thsAttributeFromDut_29();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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));
            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));
            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));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 30;

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

    CHIP_ERROR Test0WaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR Test1aThSendsDownOrCloseCommandToPrepositionTheDutInTheOppositeDirection_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster downOrCloseWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"1a: TH sends DownOrClose command to preposition the DUT in the opposite direction Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1bThWaitsFor10SecondsMovementsOnTheDevice_2()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test1cIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"1c: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                if (value != nil) {

                    VerifyOrReturn(CheckConstraintType("currentPositionLiftPercent100ths", "Percent100ths", "Percent100ths"));
                    VerifyOrReturn(CheckConstraintMinValue<chip::Percent100ths>(
                        "currentPositionLiftPercent100ths", [value unsignedShortValue], 1U));
                    VerifyOrReturn(CheckConstraintMaxValue<chip::Percent100ths>(
                        "currentPositionLiftPercent100ths", [value unsignedShortValue], 10000U));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1dIfPaLfThReadsCurrentPositionLiftPercentageOptionalAttributeFromDut_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionLiftPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"1d: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("currentPositionLiftPercentage", "Percent", "Percent"));
                VerifyOrReturn(
                    CheckConstraintMinValue<chip::Percent>("currentPositionLiftPercentage", [value unsignedCharValue], 1U));
                VerifyOrReturn(
                    CheckConstraintMaxValue<chip::Percent>("currentPositionLiftPercentage", [value unsignedCharValue], 100U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1eIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"1e: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                if (value != nil) {

                    VerifyOrReturn(CheckConstraintType("currentPositionTiltPercent100ths", "Percent100ths", "Percent100ths"));
                    VerifyOrReturn(CheckConstraintMinValue<chip::Percent100ths>(
                        "currentPositionTiltPercent100ths", [value unsignedShortValue], 1U));
                    VerifyOrReturn(CheckConstraintMaxValue<chip::Percent100ths>(
                        "currentPositionTiltPercent100ths", [value unsignedShortValue], 10000U));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1fIfPaTlThReadsCurrentPositionTiltPercentageOptionalAttributeFromDut_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionTiltPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"1f: If (PA & TL) TH reads CurrentPositionTiltPercentage optional attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("currentPositionTiltPercentage", "Percent", "Percent"));
                VerifyOrReturn(
                    CheckConstraintMinValue<chip::Percent>("currentPositionTiltPercentage", [value unsignedCharValue], 1U));
                VerifyOrReturn(
                    CheckConstraintMaxValue<chip::Percent>("currentPositionTiltPercentage", [value unsignedCharValue], 100U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    bool testSendClusterTest_TC_WNCV_3_1_7_WaitForReport_Fulfilled = false;
    ResponseHandler _Nullable test_Test_TC_WNCV_3_1_OperationalStatus_Reported = nil;

    CHIP_ERROR TestReport2SubscribeToDutReportsOnOperationalStatusAttribute_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        test_Test_TC_WNCV_3_1_OperationalStatus_Reported = ^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Report: 2: Subscribe to DUT reports on OperationalStatus attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("operationalStatus", "bitmap8", "bitmap8"));
            testSendClusterTest_TC_WNCV_3_1_7_WaitForReport_Fulfilled = true;
        };

        NextTest();
        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2SubscribeToDutReportsOnOperationalStatusAttribute_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        uint16_t minIntervalArgument = 4U;
        uint16_t maxIntervalArgument = 5U;
        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(minIntervalArgument)
                                                                   maxInterval:@(maxIntervalArgument)];
        params.filterByFabric = true;
        params.replaceExistingSubscriptions = true;
        [cluster subscribeAttributeOperationalStatusWithParams:params
            subscriptionEstablished:^{
                VerifyOrReturn(
                    testSendClusterTest_TC_WNCV_3_1_7_WaitForReport_Fulfilled, SetCommandExitStatus(CHIP_ERROR_INCORRECT_STATE));
                NextTest();
            }
            reportHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"2: Subscribe to DUT reports on OperationalStatus attribute Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
                if (test_Test_TC_WNCV_3_1_OperationalStatus_Reported != nil) {
                    ResponseHandler callback = test_Test_TC_WNCV_3_1_OperationalStatus_Reported;
                    test_Test_TC_WNCV_3_1_OperationalStatus_Reported = nil;
                    callback(value, err);
                }
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2aThSendsUpOrOpenCommandToDut_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster upOrOpenWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"2a: TH sends UpOrOpen command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2bDutUpdatesItsAttributes_10()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test2cIfPaLfThReadsTargetPositionLiftPercent100thsAttributeFromDut_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"2c: If (PA & LF) TH reads TargetPositionLiftPercent100ths attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("TargetPositionLiftPercent100ths", actualValue));
                VerifyOrReturn(CheckValue("TargetPositionLiftPercent100ths", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2dIfPaTlThReadsTargetPositionTiltPercent100thsAttributeFromDut_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"2d: If (PA & TL) TH reads TargetPositionTiltPercent100ths attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("TargetPositionTiltPercent100ths", actualValue));
                VerifyOrReturn(CheckValue("TargetPositionTiltPercent100ths", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2eThLeaveTheDeviceMovingFor2Seconds_13()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 2000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test3aThReadsOperationalStatusAttributesBit01_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3a: TH reads OperationalStatus attribute's bit 0..1 Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("operationalStatus", "bitmap8", "bitmap8"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3aThReadsOperationalStatusAttributesBit23Wncvsf00lf_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3a: TH reads OperationalStatus attribute's bit 2..3 (WNCV.S.F00(LF)) Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("operationalStatus", "bitmap8", "bitmap8"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3aThReadsOperationalStatusAttributesBit23Wncvsf00lf_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3a: TH reads OperationalStatus attribute's bit 2..3 (WNCV.S.F00(LF)) Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("operationalStatus", "bitmap8", "bitmap8"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3aThReadsOperationalStatusAttributesBit45Wncvsf01tl_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3a: TH reads OperationalStatus attribute's bit 4..5 (WNCV.S.F01(TL)) Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("operationalStatus", "bitmap8", "bitmap8"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3aThReadsOperationalStatusAttributesBit45Wncvsf01tl_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3a: TH reads OperationalStatus attribute's bit 4..5 (WNCV.S.F01(TL)) Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("operationalStatus", "bitmap8", "bitmap8"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3a2DutUpdatesItsAttributes_19()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 3000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test3bIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_20()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"3b: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                if (value != nil) {

                    VerifyOrReturn(CheckConstraintType("currentPositionLiftPercent100ths", "Percent100ths", "Percent100ths"));
                    VerifyOrReturn(CheckConstraintMinValue<chip::Percent100ths>(
                        "currentPositionLiftPercent100ths", [value unsignedShortValue], 0U));
                    VerifyOrReturn(CheckConstraintMaxValue<chip::Percent100ths>(
                        "currentPositionLiftPercent100ths", [value unsignedShortValue], 9999U));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3cIfPaLfThReadsCurrentPositionLiftPercentageOptionalAttributeFromDut_21()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionLiftPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3c: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("currentPositionLiftPercentage", "Percent", "Percent"));
                VerifyOrReturn(
                    CheckConstraintMinValue<chip::Percent>("currentPositionLiftPercentage", [value unsignedCharValue], 0U));
                VerifyOrReturn(
                    CheckConstraintMaxValue<chip::Percent>("currentPositionLiftPercentage", [value unsignedCharValue], 99U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3dIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_22()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"3d: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                if (value != nil) {

                    VerifyOrReturn(CheckConstraintType("currentPositionTiltPercent100ths", "Percent100ths", "Percent100ths"));
                    VerifyOrReturn(CheckConstraintMinValue<chip::Percent100ths>(
                        "currentPositionTiltPercent100ths", [value unsignedShortValue], 0U));
                    VerifyOrReturn(CheckConstraintMaxValue<chip::Percent100ths>(
                        "currentPositionTiltPercent100ths", [value unsignedShortValue], 9999U));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3eIfPaLfThReadsCurrentPositionTiltPercentageOptionalAttributeFromDut_23()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionTiltPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3e: If (PA & LF) TH reads CurrentPositionTiltPercentage optional attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("currentPositionTiltPercentage", "Percent", "Percent"));
                VerifyOrReturn(
                    CheckConstraintMinValue<chip::Percent>("currentPositionTiltPercentage", [value unsignedCharValue], 0U));
                VerifyOrReturn(
                    CheckConstraintMaxValue<chip::Percent>("currentPositionTiltPercentage", [value unsignedCharValue], 99U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test4aThSendsAStopMotionCommandToDut_24()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster stopMotionWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"4a: TH sends a StopMotion command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test4bThWaitsFor3SecondsTheEndOfInertialMovementsOnTheDevice_25()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 3000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test4cVerifyDutUpdateOperationalStatusAttributeToThAfterAStopMotion_26()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"4c: Verify DUT update OperationalStatus attribute to TH after a StopMotion Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OperationalStatus", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test5aThWaitsForXSecondsAttributesUpdateOnTheDevice_27()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 1000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test5bIfPaLfThReadsTargetPositionLiftPercent100thsAttributeFromDut_28()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"5b: If (PA & LF) TH reads TargetPositionLiftPercent100ths attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("targetPositionLiftPercent100ths", "Percent100ths", "Percent100ths"));
                VerifyOrReturn(CheckConstraintMinValue<chip::Percent100ths>(
                    "targetPositionLiftPercent100ths", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<chip::Percent100ths>(
                    "targetPositionLiftPercent100ths", [value unsignedShortValue], 9999U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test5cIfPaTlThReadsTargetPositionTiltPercent100thsAttributeFromDut_29()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"5c: If (PA & TL) TH reads TargetPositionTiltPercent100ths attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("targetPositionTiltPercent100ths", "Percent100ths", "Percent100ths"));
                VerifyOrReturn(CheckConstraintMinValue<chip::Percent100ths>(
                    "targetPositionTiltPercent100ths", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<chip::Percent100ths>(
                    "targetPositionTiltPercent100ths", [value unsignedShortValue], 9999U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_3_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_WNCV_3_2()
        : TestCommandBridge("Test_TC_WNCV_3_2")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_WNCV_3_2() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_WNCV_3_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_WNCV_3_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : 0: Wait for the commissioned device to be retrieved\n");
            err = Test0WaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(
                chipTool, " ***** Test Step 1 : 1a: TH sends UpOrOpen command to preposition the DUT in the opposite direction\n");
            if (ShouldSkip("WNCV.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = Test1aThSendsUpOrOpenCommandToPrepositionTheDutInTheOppositeDirection_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : 1b: TH Waits for 10 seconds movement(s) on the device\n");
            err = Test1bThWaitsFor10SecondsMovementsOnTheDevice_2();
            break;
        case 3:
            ChipLogProgress(
                chipTool, " ***** Test Step 3 : 1c: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e")) {
                NextTest();
                return;
            }
            err = Test1cIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool,
                " ***** Test Step 4 : 1d: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A0008")) {
                NextTest();
                return;
            }
            err = Test1dIfPaLfThReadsCurrentPositionLiftPercentageOptionalAttributeFromDut_4();
            break;
        case 5:
            ChipLogProgress(
                chipTool, " ***** Test Step 5 : 1e: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f")) {
                NextTest();
                return;
            }
            err = Test1eIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool,
                " ***** Test Step 6 : 1f: If (PA & TL) TH reads CurrentPositionTiltPercentage optional attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A0009")) {
                NextTest();
                return;
            }
            err = Test1fIfPaTlThReadsCurrentPositionTiltPercentageOptionalAttributeFromDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Report: 2: Subscribe to DUT reports on OperationalStatus attribute\n");
            err = TestReport2SubscribeToDutReportsOnOperationalStatusAttribute_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : 2: Subscribe to DUT reports on OperationalStatus attribute\n");
            err = Test2SubscribeToDutReportsOnOperationalStatusAttribute_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : 2a: TH sends DownOrClose command to DUT\n");
            if (ShouldSkip("WNCV.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = Test2aThSendsDownOrCloseCommandToDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : 2b: DUT updates its attributes\n");
            err = Test2bDutUpdatesItsAttributes_10();
            break;
        case 11:
            ChipLogProgress(
                chipTool, " ***** Test Step 11 : 2c: If (PA & LF) TH reads TargetPositionLiftPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000b")) {
                NextTest();
                return;
            }
            err = Test2cIfPaLfThReadsTargetPositionLiftPercent100thsAttributeFromDut_11();
            break;
        case 12:
            ChipLogProgress(
                chipTool, " ***** Test Step 12 : 2d: If (PA & TL) TH reads TargetPositionTiltPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000c")) {
                NextTest();
                return;
            }
            err = Test2dIfPaTlThReadsTargetPositionTiltPercent100thsAttributeFromDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : 2e: TH leave the device moving for 2 seconds\n");
            err = Test2eThLeaveTheDeviceMovingFor2Seconds_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : 3a: TH reads OperationalStatus attribute's bit 0..1\n");
            if (ShouldSkip("WNCV.S.A000a")) {
                NextTest();
                return;
            }
            err = Test3aThReadsOperationalStatusAttributesBit01_14();
            break;
        case 15:
            ChipLogProgress(
                chipTool, " ***** Test Step 15 : 3a: TH reads OperationalStatus attribute's bit 2..3 (WNCV.S.F00(LF))\n");
            if (ShouldSkip("WNCV.S.A000a && WNCV.S.F00")) {
                NextTest();
                return;
            }
            err = Test3aThReadsOperationalStatusAttributesBit23Wncvsf00lf_15();
            break;
        case 16:
            ChipLogProgress(
                chipTool, " ***** Test Step 16 : 3a: TH reads OperationalStatus attribute's bit 2..3 (WNCV.S.F00(LF))\n");
            if (ShouldSkip("WNCV.S.A000a && !WNCV.S.F00")) {
                NextTest();
                return;
            }
            err = Test3aThReadsOperationalStatusAttributesBit23Wncvsf00lf_16();
            break;
        case 17:
            ChipLogProgress(
                chipTool, " ***** Test Step 17 : 3a: TH reads OperationalStatus attribute's bit 4..5 (WNCV.S.F01(TL))\n");
            if (ShouldSkip("WNCV.S.A000a && WNCV.S.F01")) {
                NextTest();
                return;
            }
            err = Test3aThReadsOperationalStatusAttributesBit45Wncvsf01tl_17();
            break;
        case 18:
            ChipLogProgress(
                chipTool, " ***** Test Step 18 : 3a: TH reads OperationalStatus attribute's bit 4..5 (WNCV.S.F01(TL))\n");
            if (ShouldSkip("WNCV.S.A000a && !WNCV.S.F01")) {
                NextTest();
                return;
            }
            err = Test3aThReadsOperationalStatusAttributesBit45Wncvsf01tl_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : 3a2: DUT updates its attributes\n");
            err = Test3a2DutUpdatesItsAttributes_19();
            break;
        case 20:
            ChipLogProgress(
                chipTool, " ***** Test Step 20 : 3b: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e")) {
                NextTest();
                return;
            }
            err = Test3bIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_20();
            break;
        case 21:
            ChipLogProgress(chipTool,
                " ***** Test Step 21 : 3c: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A0008")) {
                NextTest();
                return;
            }
            err = Test3cIfPaLfThReadsCurrentPositionLiftPercentageOptionalAttributeFromDut_21();
            break;
        case 22:
            ChipLogProgress(
                chipTool, " ***** Test Step 22 : 3d: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f")) {
                NextTest();
                return;
            }
            err = Test3dIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_22();
            break;
        case 23:
            ChipLogProgress(chipTool,
                " ***** Test Step 23 : 3e: If (PA & LF) TH reads CurrentPositionTiltPercentage optional attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A0009")) {
                NextTest();
                return;
            }
            err = Test3eIfPaLfThReadsCurrentPositionTiltPercentageOptionalAttributeFromDut_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : 4a: TH sends a StopMotion command to DUT\n");
            if (ShouldSkip("WNCV.S.C02.Rsp")) {
                NextTest();
                return;
            }
            err = Test4aThSendsAStopMotionCommandToDut_24();
            break;
        case 25:
            ChipLogProgress(
                chipTool, " ***** Test Step 25 : 4b: TH waits for 3 seconds the end of inertial movement(s) on the device\n");
            err = Test4bThWaitsFor3SecondsTheEndOfInertialMovementsOnTheDevice_25();
            break;
        case 26:
            ChipLogProgress(
                chipTool, " ***** Test Step 26 : 4c: Verify DUT update OperationalStatus attribute to TH after a StopMotion\n");
            if (ShouldSkip("WNCV.S.A000a")) {
                NextTest();
                return;
            }
            err = Test4cVerifyDutUpdateOperationalStatusAttributeToThAfterAStopMotion_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : 5a: TH waits for x seconds attributes update on the device\n");
            err = Test5aThWaitsForXSecondsAttributesUpdateOnTheDevice_27();
            break;
        case 28:
            ChipLogProgress(
                chipTool, " ***** Test Step 28 : 5b: If (PA & LF) TH reads TargetPositionLiftPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000b")) {
                NextTest();
                return;
            }
            err = Test5bIfPaLfThReadsTargetPositionLiftPercent100thsAttributeFromDut_28();
            break;
        case 29:
            ChipLogProgress(
                chipTool, " ***** Test Step 29 : 5c: If (PA & TL) TH reads TargetPositionTiltPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000c")) {
                NextTest();
                return;
            }
            err = Test5cIfPaTlThReadsTargetPositionTiltPercent100thsAttributeFromDut_29();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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));
            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));
            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));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 30;

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

    CHIP_ERROR Test0WaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR Test1aThSendsUpOrOpenCommandToPrepositionTheDutInTheOppositeDirection_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster upOrOpenWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"1a: TH sends UpOrOpen command to preposition the DUT in the opposite direction Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1bThWaitsFor10SecondsMovementsOnTheDevice_2()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test1cIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"1c: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                if (value != nil) {

                    VerifyOrReturn(CheckConstraintType("currentPositionLiftPercent100ths", "Percent100ths", "Percent100ths"));
                    VerifyOrReturn(CheckConstraintMinValue<chip::Percent100ths>(
                        "currentPositionLiftPercent100ths", [value unsignedShortValue], 0U));
                    VerifyOrReturn(CheckConstraintMaxValue<chip::Percent100ths>(
                        "currentPositionLiftPercent100ths", [value unsignedShortValue], 9999U));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1dIfPaLfThReadsCurrentPositionLiftPercentageOptionalAttributeFromDut_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionLiftPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"1d: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("currentPositionLiftPercentage", "Percent", "Percent"));
                VerifyOrReturn(
                    CheckConstraintMinValue<chip::Percent>("currentPositionLiftPercentage", [value unsignedCharValue], 0U));
                VerifyOrReturn(
                    CheckConstraintMaxValue<chip::Percent>("currentPositionLiftPercentage", [value unsignedCharValue], 99U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1eIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"1e: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                if (value != nil) {

                    VerifyOrReturn(CheckConstraintType("currentPositionTiltPercent100ths", "Percent100ths", "Percent100ths"));
                    VerifyOrReturn(CheckConstraintMinValue<chip::Percent100ths>(
                        "currentPositionTiltPercent100ths", [value unsignedShortValue], 0U));
                    VerifyOrReturn(CheckConstraintMaxValue<chip::Percent100ths>(
                        "currentPositionTiltPercent100ths", [value unsignedShortValue], 9999U));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1fIfPaTlThReadsCurrentPositionTiltPercentageOptionalAttributeFromDut_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionTiltPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"1f: If (PA & TL) TH reads CurrentPositionTiltPercentage optional attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("currentPositionTiltPercentage", "Percent", "Percent"));
                VerifyOrReturn(
                    CheckConstraintMinValue<chip::Percent>("currentPositionTiltPercentage", [value unsignedCharValue], 0U));
                VerifyOrReturn(
                    CheckConstraintMaxValue<chip::Percent>("currentPositionTiltPercentage", [value unsignedCharValue], 99U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    bool testSendClusterTest_TC_WNCV_3_2_7_WaitForReport_Fulfilled = false;
    ResponseHandler _Nullable test_Test_TC_WNCV_3_2_OperationalStatus_Reported = nil;

    CHIP_ERROR TestReport2SubscribeToDutReportsOnOperationalStatusAttribute_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        test_Test_TC_WNCV_3_2_OperationalStatus_Reported = ^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Report: 2: Subscribe to DUT reports on OperationalStatus attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("operationalStatus", "bitmap8", "bitmap8"));
            testSendClusterTest_TC_WNCV_3_2_7_WaitForReport_Fulfilled = true;
        };

        NextTest();
        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2SubscribeToDutReportsOnOperationalStatusAttribute_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        uint16_t minIntervalArgument = 4U;
        uint16_t maxIntervalArgument = 5U;
        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(minIntervalArgument)
                                                                   maxInterval:@(maxIntervalArgument)];
        params.filterByFabric = true;
        params.replaceExistingSubscriptions = true;
        [cluster subscribeAttributeOperationalStatusWithParams:params
            subscriptionEstablished:^{
                VerifyOrReturn(
                    testSendClusterTest_TC_WNCV_3_2_7_WaitForReport_Fulfilled, SetCommandExitStatus(CHIP_ERROR_INCORRECT_STATE));
                NextTest();
            }
            reportHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"2: Subscribe to DUT reports on OperationalStatus attribute Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
                if (test_Test_TC_WNCV_3_2_OperationalStatus_Reported != nil) {
                    ResponseHandler callback = test_Test_TC_WNCV_3_2_OperationalStatus_Reported;
                    test_Test_TC_WNCV_3_2_OperationalStatus_Reported = nil;
                    callback(value, err);
                }
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2aThSendsDownOrCloseCommandToDut_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster downOrCloseWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"2a: TH sends DownOrClose command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2bDutUpdatesItsAttributes_10()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test2cIfPaLfThReadsTargetPositionLiftPercent100thsAttributeFromDut_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"2c: If (PA & LF) TH reads TargetPositionLiftPercent100ths attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("TargetPositionLiftPercent100ths", actualValue));
                VerifyOrReturn(CheckValue("TargetPositionLiftPercent100ths", actualValue, 10000U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2dIfPaTlThReadsTargetPositionTiltPercent100thsAttributeFromDut_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"2d: If (PA & TL) TH reads TargetPositionTiltPercent100ths attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("TargetPositionTiltPercent100ths", actualValue));
                VerifyOrReturn(CheckValue("TargetPositionTiltPercent100ths", actualValue, 10000U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2eThLeaveTheDeviceMovingFor2Seconds_13()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 2000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test3aThReadsOperationalStatusAttributesBit01_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3a: TH reads OperationalStatus attribute's bit 0..1 Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("operationalStatus", "bitmap8", "bitmap8"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3aThReadsOperationalStatusAttributesBit23Wncvsf00lf_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3a: TH reads OperationalStatus attribute's bit 2..3 (WNCV.S.F00(LF)) Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("operationalStatus", "bitmap8", "bitmap8"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3aThReadsOperationalStatusAttributesBit23Wncvsf00lf_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3a: TH reads OperationalStatus attribute's bit 2..3 (WNCV.S.F00(LF)) Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("operationalStatus", "bitmap8", "bitmap8"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3aThReadsOperationalStatusAttributesBit45Wncvsf01tl_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3a: TH reads OperationalStatus attribute's bit 4..5 (WNCV.S.F01(TL)) Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("operationalStatus", "bitmap8", "bitmap8"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3aThReadsOperationalStatusAttributesBit45Wncvsf01tl_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3a: TH reads OperationalStatus attribute's bit 4..5 (WNCV.S.F01(TL)) Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("operationalStatus", "bitmap8", "bitmap8"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3a2DutUpdatesItsAttributes_19()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 3000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test3bIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_20()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"3b: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                if (value != nil) {

                    VerifyOrReturn(CheckConstraintType("currentPositionLiftPercent100ths", "Percent100ths", "Percent100ths"));
                    VerifyOrReturn(CheckConstraintMinValue<chip::Percent100ths>(
                        "currentPositionLiftPercent100ths", [value unsignedShortValue], 1U));
                    VerifyOrReturn(CheckConstraintMaxValue<chip::Percent100ths>(
                        "currentPositionLiftPercent100ths", [value unsignedShortValue], 10000U));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3cIfPaLfThReadsCurrentPositionLiftPercentageOptionalAttributeFromDut_21()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionLiftPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3c: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("currentPositionLiftPercentage", "Percent", "Percent"));
                VerifyOrReturn(
                    CheckConstraintMinValue<chip::Percent>("currentPositionLiftPercentage", [value unsignedCharValue], 1U));
                VerifyOrReturn(
                    CheckConstraintMaxValue<chip::Percent>("currentPositionLiftPercentage", [value unsignedCharValue], 100U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3dIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_22()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"3d: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                if (value != nil) {

                    VerifyOrReturn(CheckConstraintType("currentPositionTiltPercent100ths", "Percent100ths", "Percent100ths"));
                    VerifyOrReturn(CheckConstraintMinValue<chip::Percent100ths>(
                        "currentPositionTiltPercent100ths", [value unsignedShortValue], 1U));
                    VerifyOrReturn(CheckConstraintMaxValue<chip::Percent100ths>(
                        "currentPositionTiltPercent100ths", [value unsignedShortValue], 10000U));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3eIfPaLfThReadsCurrentPositionTiltPercentageOptionalAttributeFromDut_23()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionTiltPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3e: If (PA & LF) TH reads CurrentPositionTiltPercentage optional attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("currentPositionTiltPercentage", "Percent", "Percent"));
                VerifyOrReturn(
                    CheckConstraintMinValue<chip::Percent>("currentPositionTiltPercentage", [value unsignedCharValue], 1U));
                VerifyOrReturn(
                    CheckConstraintMaxValue<chip::Percent>("currentPositionTiltPercentage", [value unsignedCharValue], 100U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test4aThSendsAStopMotionCommandToDut_24()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster stopMotionWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"4a: TH sends a StopMotion command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test4bThWaitsFor3SecondsTheEndOfInertialMovementsOnTheDevice_25()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 3000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test4cVerifyDutUpdateOperationalStatusAttributeToThAfterAStopMotion_26()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"4c: Verify DUT update OperationalStatus attribute to TH after a StopMotion Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OperationalStatus", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test5aThWaitsForXSecondsAttributesUpdateOnTheDevice_27()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 1000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test5bIfPaLfThReadsTargetPositionLiftPercent100thsAttributeFromDut_28()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"5b: If (PA & LF) TH reads TargetPositionLiftPercent100ths attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("targetPositionLiftPercent100ths", "Percent100ths", "Percent100ths"));
                VerifyOrReturn(CheckConstraintMinValue<chip::Percent100ths>(
                    "targetPositionLiftPercent100ths", [value unsignedShortValue], 1U));
                VerifyOrReturn(CheckConstraintMaxValue<chip::Percent100ths>(
                    "targetPositionLiftPercent100ths", [value unsignedShortValue], 10000U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test5cIfPaTlThReadsTargetPositionTiltPercent100thsAttributeFromDut_29()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"5c: If (PA & TL) TH reads TargetPositionTiltPercent100ths attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("targetPositionTiltPercent100ths", "Percent100ths", "Percent100ths"));
                VerifyOrReturn(CheckConstraintMinValue<chip::Percent100ths>(
                    "targetPositionTiltPercent100ths", [value unsignedShortValue], 1U));
                VerifyOrReturn(CheckConstraintMaxValue<chip::Percent100ths>(
                    "targetPositionTiltPercent100ths", [value unsignedShortValue], 10000U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_3_3 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_WNCV_3_3()
        : TestCommandBridge("Test_TC_WNCV_3_3")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_WNCV_3_3() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_WNCV_3_3\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_WNCV_3_3\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : 0: Wait for the commissioned device to be retrieved\n");
            err = Test0WaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool,
                " ***** Test Step 1 : 1a: TH sends DownOrClose command to preposition the DUT in the opposite direction\n");
            if (ShouldSkip("WNCV.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = Test1aThSendsDownOrCloseCommandToPrepositionTheDutInTheOppositeDirection_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : 1b: TH Waits for 6-8 seconds movement(s) on the device\n");
            err = Test1bThWaitsFor68SecondsMovementsOnTheDevice_2();
            break;
        case 3:
            ChipLogProgress(
                chipTool, " ***** Test Step 3 : 1c: TH sends UpOrOpen command to preposition the DUT in the opposite direction\n");
            if (ShouldSkip("WNCV.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = Test1cThSendsUpOrOpenCommandToPrepositionTheDutInTheOppositeDirection_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : 1d: TH Waits for 2 seconds movement(s) on the device\n");
            err = Test1dThWaitsFor2SecondsMovementsOnTheDevice_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : 1e: TH reads OperationalStatus attribute from DUT\n");
            if (ShouldSkip("WNCV.S.A000a")) {
                NextTest();
                return;
            }
            err = Test1eThReadsOperationalStatusAttributeFromDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : 1d: TH Waits for 2 seconds movement(s) on the device\n");
            err = Test1dThWaitsFor2SecondsMovementsOnTheDevice_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Report: 2: Subscribe to DUT reports on OperationalStatus attribute\n");
            err = TestReport2SubscribeToDutReportsOnOperationalStatusAttribute_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : 2: Subscribe to DUT reports on OperationalStatus attribute\n");
            err = Test2SubscribeToDutReportsOnOperationalStatusAttribute_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : 2a: TH sends a StopMotion command to DUT\n");
            if (ShouldSkip("WNCV.S.C02.Rsp")) {
                NextTest();
                return;
            }
            err = Test2aThSendsAStopMotionCommandToDut_9();
            break;
        case 10:
            ChipLogProgress(
                chipTool, " ***** Test Step 10 : 2b: TH waits for 3 seconds the end of inertial movement(s) on the device\n");
            err = Test2bThWaitsFor3SecondsTheEndOfInertialMovementsOnTheDevice_10();
            break;
        case 11:
            ChipLogProgress(
                chipTool, " ***** Test Step 11 : 2c: TH reads OperationalStatus attribute from DUT after a StopMotion\n");
            if (ShouldSkip("WNCV.S.A000a")) {
                NextTest();
                return;
            }
            err = Test2cThReadsOperationalStatusAttributeFromDutAfterAStopMotion_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : 2d: TH waits for 100ms - 3s attributes update on the device\n");
            err = Test2dThWaitsFor100ms3sAttributesUpdateOnTheDevice_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : 2e: TH reads OperationalStatus attribute from DUT\n");
            if (ShouldSkip("WNCV.S.A000a")) {
                NextTest();
                return;
            }
            err = Test2eThReadsOperationalStatusAttributeFromDut_13();
            break;
        case 14:
            ChipLogProgress(
                chipTool, " ***** Test Step 14 : 3a: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e")) {
                NextTest();
                return;
            }
            err = Test3aIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool,
                " ***** Test Step 15 : 3b: If (PA & LF) TH reads TargetPositionLiftPercent100ths attribute 3c: it Must be equal "
                "with CurrentPositionLiftPercent100ths from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000b && WNCV.S.A000e")) {
                NextTest();
                return;
            }
            err = Test3bIfPaLfThReadsTargetPositionLiftPercent100thsAttribute3cItMustBeEqualWithCurrentPositionLiftPercent100thsFromDut_15();
            break;
        case 16:
            ChipLogProgress(
                chipTool, " ***** Test Step 16 : 4a: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f")) {
                NextTest();
                return;
            }
            err = Test4aIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_16();
            break;
        case 17:
            ChipLogProgress(chipTool,
                " ***** Test Step 17 : 4b: If (PA & TL) TH reads TargetPositionTiltPercent100ths attribute 4c: it Must be equal "
                "with CurrentPositionTiltPercent100ths from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000c && WNCV.S.A000f && PICS_SKIP_SAMPLE_APP")) {
                NextTest();
                return;
            }
            err = Test4bIfPaTlThReadsTargetPositionTiltPercent100thsAttribute4cItMustBeEqualWithCurrentPositionTiltPercent100thsFromDut_17();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 18;

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

    CHIP_ERROR Test0WaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR Test1aThSendsDownOrCloseCommandToPrepositionTheDutInTheOppositeDirection_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster downOrCloseWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"1a: TH sends DownOrClose command to preposition the DUT in the opposite direction Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1bThWaitsFor68SecondsMovementsOnTheDevice_2()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 6000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test1cThSendsUpOrOpenCommandToPrepositionTheDutInTheOppositeDirection_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster upOrOpenWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"1c: TH sends UpOrOpen command to preposition the DUT in the opposite direction Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1dThWaitsFor2SecondsMovementsOnTheDevice_4()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 2000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test1eThReadsOperationalStatusAttributeFromDut_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"1e: TH reads OperationalStatus attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintNotValue("operationalStatus", value, 0U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1dThWaitsFor2SecondsMovementsOnTheDevice_6()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 2000UL;
        return WaitForMs("alpha", value);
    }
    bool testSendClusterTest_TC_WNCV_3_3_7_WaitForReport_Fulfilled = false;
    ResponseHandler _Nullable test_Test_TC_WNCV_3_3_OperationalStatus_Reported = nil;

    CHIP_ERROR TestReport2SubscribeToDutReportsOnOperationalStatusAttribute_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        test_Test_TC_WNCV_3_3_OperationalStatus_Reported = ^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Report: 2: Subscribe to DUT reports on OperationalStatus attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("operationalStatus", "bitmap8", "bitmap8"));
            testSendClusterTest_TC_WNCV_3_3_7_WaitForReport_Fulfilled = true;
        };

        NextTest();
        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2SubscribeToDutReportsOnOperationalStatusAttribute_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        uint16_t minIntervalArgument = 4U;
        uint16_t maxIntervalArgument = 5U;
        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(minIntervalArgument)
                                                                   maxInterval:@(maxIntervalArgument)];
        params.filterByFabric = true;
        params.replaceExistingSubscriptions = true;
        [cluster subscribeAttributeOperationalStatusWithParams:params
            subscriptionEstablished:^{
                VerifyOrReturn(
                    testSendClusterTest_TC_WNCV_3_3_7_WaitForReport_Fulfilled, SetCommandExitStatus(CHIP_ERROR_INCORRECT_STATE));
                NextTest();
            }
            reportHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"2: Subscribe to DUT reports on OperationalStatus attribute Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
                if (test_Test_TC_WNCV_3_3_OperationalStatus_Reported != nil) {
                    ResponseHandler callback = test_Test_TC_WNCV_3_3_OperationalStatus_Reported;
                    test_Test_TC_WNCV_3_3_OperationalStatus_Reported = nil;
                    callback(value, err);
                }
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2aThSendsAStopMotionCommandToDut_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster stopMotionWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"2a: TH sends a StopMotion command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2bThWaitsFor3SecondsTheEndOfInertialMovementsOnTheDevice_10()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 3000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test2cThReadsOperationalStatusAttributeFromDutAfterAStopMotion_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"2c: TH reads OperationalStatus attribute from DUT after a StopMotion Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OperationalStatus", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2dThWaitsFor100ms3sAttributesUpdateOnTheDevice_12()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 2000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test2eThReadsOperationalStatusAttributeFromDut_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"2e: TH reads OperationalStatus attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OperationalStatus", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nullable attrCurrentPositionLift;

    CHIP_ERROR Test3aIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"3a: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                if (value != nil) {

                    VerifyOrReturn(CheckConstraintMinValue<chip::Percent100ths>(
                        "currentPositionLiftPercent100ths", [value unsignedShortValue], 0U));
                    VerifyOrReturn(CheckConstraintMaxValue<chip::Percent100ths>(
                        "currentPositionLiftPercent100ths", [value unsignedShortValue], 10000U));
                }
                {
                    attrCurrentPositionLift = value;
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    Test3bIfPaLfThReadsTargetPositionLiftPercent100thsAttribute3cItMustBeEqualWithCurrentPositionLiftPercent100thsFromDut_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3b: If (PA & LF) TH reads TargetPositionLiftPercent100ths attribute 3c: it Must be equal with "
                  @"CurrentPositionLiftPercent100ths from DUT Error: %@",
                err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                if (attrCurrentPositionLift == nil) {
                    VerifyOrReturn(CheckValueNull("TargetPositionLiftPercent100ths", actualValue));
                } else {
                    VerifyOrReturn(CheckValueNonNull("TargetPositionLiftPercent100ths", actualValue));
                    VerifyOrReturn(CheckValue("TargetPositionLiftPercent100ths", actualValue, attrCurrentPositionLift));
                }
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nullable attrCurrentPositionTilt;

    CHIP_ERROR Test4aIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"4a: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                if (value != nil) {

                    VerifyOrReturn(CheckConstraintMinValue<chip::Percent100ths>(
                        "currentPositionTiltPercent100ths", [value unsignedShortValue], 0U));
                    VerifyOrReturn(CheckConstraintMaxValue<chip::Percent100ths>(
                        "currentPositionTiltPercent100ths", [value unsignedShortValue], 10000U));
                }
                {
                    attrCurrentPositionTilt = value;
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    Test4bIfPaTlThReadsTargetPositionTiltPercent100thsAttribute4cItMustBeEqualWithCurrentPositionTiltPercent100thsFromDut_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"4b: If (PA & TL) TH reads TargetPositionTiltPercent100ths attribute 4c: it Must be equal with "
                  @"CurrentPositionTiltPercent100ths from DUT Error: %@",
                err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                if (attrCurrentPositionTilt == nil) {
                    VerifyOrReturn(CheckValueNull("TargetPositionTiltPercent100ths", actualValue));
                } else {
                    VerifyOrReturn(CheckValueNonNull("TargetPositionTiltPercent100ths", actualValue));
                    VerifyOrReturn(CheckValue("TargetPositionTiltPercent100ths", actualValue, attrCurrentPositionTilt));
                }
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_3_4 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_WNCV_3_4()
        : TestCommandBridge("Test_TC_WNCV_3_4")
        , mTestIndex(0)
    {
        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);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_WNCV_3_4() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_WNCV_3_4\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_WNCV_3_4\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : 0: Wait for the commissioned device to be retrieved\n");
            err = Test0WaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool,
                " ***** Test Step 1 : 1a: TH sends DownOrClose command to preposition the DUT in the opposite direction\n");
            if (ShouldSkip("WNCV.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = Test1aThSendsDownOrCloseCommandToPrepositionTheDutInTheOppositeDirection_1();
            break;
        case 2:
            ChipLogProgress(
                chipTool, " ***** Test Step 2 : 1b: TH Waits for fastMotionDuration seconds movement(s) on the device\n");
            err = Test1bThWaitsForFastMotionDurationSecondsMovementsOnTheDevice_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : 2a: TH sends UpOrOpen command to DUT\n");
            if (ShouldSkip("WNCV.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = Test2aThSendsUpOrOpenCommandToDut_3();
            break;
        case 4:
            ChipLogProgress(
                chipTool, " ***** Test Step 4 : 2b: TH Waits for fullMotionDuration seconds movement(s) on the device\n");
            err = Test2bThWaitsForFullMotionDurationSecondsMovementsOnTheDevice_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : 2c: TH reads OperationalStatus attribute from DUT\n");
            if (ShouldSkip("WNCV.S.A000a")) {
                NextTest();
                return;
            }
            err = Test2cThReadsOperationalStatusAttributeFromDut_5();
            break;
        case 6:
            ChipLogProgress(
                chipTool, " ***** Test Step 6 : 3a: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e")) {
                NextTest();
                return;
            }
            err = Test3aIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool,
                " ***** Test Step 7 : 3b: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A0008")) {
                NextTest();
                return;
            }
            err = Test3bIfPaLfThReadsCurrentPositionLiftPercentageOptionalAttributeFromDut_7();
            break;
        case 8:
            ChipLogProgress(
                chipTool, " ***** Test Step 8 : 3c: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f")) {
                NextTest();
                return;
            }
            err = Test3cIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_8();
            break;
        case 9:
            ChipLogProgress(chipTool,
                " ***** Test Step 9 : 3d: If (PA & TL) TH reads CurrentPositionTiltPercentage optional attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A0009")) {
                NextTest();
                return;
            }
            err = Test3dIfPaTlThReadsCurrentPositionTiltPercentageOptionalAttributeFromDut_9();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 10;

    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_ERROR Test0WaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR Test1aThSendsDownOrCloseCommandToPrepositionTheDutInTheOppositeDirection_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster downOrCloseWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"1a: TH sends DownOrClose command to preposition the DUT in the opposite direction Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1bThWaitsForFastMotionDurationSecondsMovementsOnTheDevice_2()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = mFastMotionDuration.HasValue() ? mFastMotionDuration.Value() : 3000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test2aThSendsUpOrOpenCommandToDut_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster upOrOpenWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"2a: TH sends UpOrOpen command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2bThWaitsForFullMotionDurationSecondsMovementsOnTheDevice_4()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = mFullMotionDuration.HasValue() ? mFullMotionDuration.Value() : 6000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test2cThReadsOperationalStatusAttributeFromDut_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"2c: TH reads OperationalStatus attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OperationalStatus", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3aIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"3a: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                {
                    id actualValue = value;
                    VerifyOrReturn(CheckValueNonNull("CurrentPositionLiftPercent100ths", actualValue));
                    VerifyOrReturn(CheckValue("CurrentPositionLiftPercent100ths", actualValue, 0U));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3bIfPaLfThReadsCurrentPositionLiftPercentageOptionalAttributeFromDut_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionLiftPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3b: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentPositionLiftPercentage", actualValue));
                VerifyOrReturn(CheckValue("CurrentPositionLiftPercentage", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3cIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"3c: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                {
                    id actualValue = value;
                    VerifyOrReturn(CheckValueNonNull("CurrentPositionTiltPercent100ths", actualValue));
                    VerifyOrReturn(CheckValue("CurrentPositionTiltPercent100ths", actualValue, 0U));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3dIfPaTlThReadsCurrentPositionTiltPercentageOptionalAttributeFromDut_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionTiltPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3d: If (PA & TL) TH reads CurrentPositionTiltPercentage optional attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentPositionTiltPercentage", actualValue));
                VerifyOrReturn(CheckValue("CurrentPositionTiltPercentage", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_3_5 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_WNCV_3_5()
        : TestCommandBridge("Test_TC_WNCV_3_5")
        , mTestIndex(0)
    {
        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);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_WNCV_3_5() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_WNCV_3_5\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_WNCV_3_5\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : 0: Wait for the commissioned device to be retrieved\n");
            err = Test0WaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(
                chipTool, " ***** Test Step 1 : 1a: TH sends UpOrOpen command to preposition the DUT in the opposite direction\n");
            if (ShouldSkip("WNCV.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = Test1aThSendsUpOrOpenCommandToPrepositionTheDutInTheOppositeDirection_1();
            break;
        case 2:
            ChipLogProgress(
                chipTool, " ***** Test Step 2 : 1b: TH Waits for fastMotionDuration seconds movement(s) on the device\n");
            err = Test1bThWaitsForFastMotionDurationSecondsMovementsOnTheDevice_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : 2a: TH sends DownOrClose command to DUT\n");
            if (ShouldSkip("WNCV.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = Test2aThSendsDownOrCloseCommandToDut_3();
            break;
        case 4:
            ChipLogProgress(
                chipTool, " ***** Test Step 4 : 2b: TH Waits for fullMotionDuration seconds movement(s) on the device\n");
            err = Test2bThWaitsForFullMotionDurationSecondsMovementsOnTheDevice_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : 2c: TH reads OperationalStatus attribute from DUT\n");
            if (ShouldSkip("WNCV.S.A000a")) {
                NextTest();
                return;
            }
            err = Test2cThReadsOperationalStatusAttributeFromDut_5();
            break;
        case 6:
            ChipLogProgress(
                chipTool, " ***** Test Step 6 : 3a: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e")) {
                NextTest();
                return;
            }
            err = Test3aIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool,
                " ***** Test Step 7 : 3b: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A0008")) {
                NextTest();
                return;
            }
            err = Test3bIfPaLfThReadsCurrentPositionLiftPercentageOptionalAttributeFromDut_7();
            break;
        case 8:
            ChipLogProgress(
                chipTool, " ***** Test Step 8 : 3c: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f")) {
                NextTest();
                return;
            }
            err = Test3cIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_8();
            break;
        case 9:
            ChipLogProgress(chipTool,
                " ***** Test Step 9 : 3d: If (PA & TL) TH reads CurrentPositionTiltPercentage optional attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A0009")) {
                NextTest();
                return;
            }
            err = Test3dIfPaTlThReadsCurrentPositionTiltPercentageOptionalAttributeFromDut_9();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 10;

    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_ERROR Test0WaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR Test1aThSendsUpOrOpenCommandToPrepositionTheDutInTheOppositeDirection_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster upOrOpenWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"1a: TH sends UpOrOpen command to preposition the DUT in the opposite direction Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1bThWaitsForFastMotionDurationSecondsMovementsOnTheDevice_2()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = mFastMotionDuration.HasValue() ? mFastMotionDuration.Value() : 3000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test2aThSendsDownOrCloseCommandToDut_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster downOrCloseWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"2a: TH sends DownOrClose command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2bThWaitsForFullMotionDurationSecondsMovementsOnTheDevice_4()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = mFullMotionDuration.HasValue() ? mFullMotionDuration.Value() : 6000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test2cThReadsOperationalStatusAttributeFromDut_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"2c: TH reads OperationalStatus attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OperationalStatus", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3aIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"3a: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                {
                    id actualValue = value;
                    VerifyOrReturn(CheckValueNonNull("CurrentPositionLiftPercent100ths", actualValue));
                    VerifyOrReturn(CheckValue("CurrentPositionLiftPercent100ths", actualValue, 10000U));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3bIfPaLfThReadsCurrentPositionLiftPercentageOptionalAttributeFromDut_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionLiftPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3b: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentPositionLiftPercentage", actualValue));
                VerifyOrReturn(CheckValue("CurrentPositionLiftPercentage", actualValue, 100U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3cIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"3c: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                {
                    id actualValue = value;
                    VerifyOrReturn(CheckValueNonNull("CurrentPositionTiltPercent100ths", actualValue));
                    VerifyOrReturn(CheckValue("CurrentPositionTiltPercent100ths", actualValue, 10000U));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3dIfPaTlThReadsCurrentPositionTiltPercentageOptionalAttributeFromDut_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionTiltPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3d: If (PA & TL) TH reads CurrentPositionTiltPercentage optional attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentPositionTiltPercentage", actualValue));
                VerifyOrReturn(CheckValue("CurrentPositionTiltPercentage", actualValue, 100U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_4_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_WNCV_4_1()
        : TestCommandBridge("Test_TC_WNCV_4_1")
        , mTestIndex(0)
    {
        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);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_WNCV_4_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_WNCV_4_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_WNCV_4_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : 0: Wait for the commissioned device to be retrieved\n");
            err = Test0WaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool,
                " ***** Test Step 1 : 1a: TH sends DownOrClose command to preposition the DUT in the opposite direction\n");
            if (ShouldSkip("WNCV.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = Test1aThSendsDownOrCloseCommandToPrepositionTheDutInTheOppositeDirection_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : 1b: TH waits for x seconds movement(s) on the DUT\n");
            err = Test1bThWaitsForXSecondsMovementsOnTheDut_2();
            break;
        case 3:
            ChipLogProgress(
                chipTool, " ***** Test Step 3 : 1c: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e")) {
                NextTest();
                return;
            }
            err = Test1cIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : 2a: TH sends GoToLiftPercentage command with 25 percent to DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.C05.Rsp")) {
                NextTest();
                return;
            }
            err = Test2aThSendsGoToLiftPercentageCommandWith25PercentToDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : 2b: DUT updates its attributes\n");
            err = Test2bDutUpdatesItsAttributes_5();
            break;
        case 6:
            ChipLogProgress(
                chipTool, " ***** Test Step 6 : 2c: If (PA & LF) TH reads TargetPositionLiftPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000b")) {
                NextTest();
                return;
            }
            err = Test2cIfPaLfThReadsTargetPositionLiftPercent100thsAttributeFromDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : 3a: TH set a timeout of X minutes for failure\n");
            err = Test3aThSetATimeoutOfXMinutesForFailure_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : 3b: TH reads OperationalStatus attribute from DUT\n");
            if (ShouldSkip("WNCV.S.A000a")) {
                NextTest();
                return;
            }
            err = Test3bThReadsOperationalStatusAttributeFromDut_8();
            break;
        case 9:
            ChipLogProgress(
                chipTool, " ***** Test Step 9 : 3c: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e")) {
                NextTest();
                return;
            }
            err = Test3cIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool,
                " ***** Test Step 10 : 3d: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A0008")) {
                NextTest();
                return;
            }
            err = Test3dIfPaLfThReadsCurrentPositionLiftPercentageOptionalAttributeFromDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : 4a: TH sends GoToLiftPercentage command with 75.20 percent to DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.C05.Rsp")) {
                NextTest();
                return;
            }
            err = Test4aThSendsGoToLiftPercentageCommandWith7520PercentToDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : 4b: DUT updates its attributes\n");
            err = Test4bDutUpdatesItsAttributes_12();
            break;
        case 13:
            ChipLogProgress(
                chipTool, " ***** Test Step 13 : 4c: If (PA & LF) TH reads TargetPositionLiftPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000b")) {
                NextTest();
                return;
            }
            err = Test4cIfPaLfThReadsTargetPositionLiftPercent100thsAttributeFromDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : 5a: TH waits for x seconds movement(s) on the DUT\n");
            err = Test5aThWaitsForXSecondsMovementsOnTheDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : 5b: TH reads OperationalStatus attribute from DUT\n");
            if (ShouldSkip("WNCV.S.A000a")) {
                NextTest();
                return;
            }
            err = Test5bThReadsOperationalStatusAttributeFromDut_15();
            break;
        case 16:
            ChipLogProgress(
                chipTool, " ***** Test Step 16 : 5c: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e")) {
                NextTest();
                return;
            }
            err = Test5cIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_16();
            break;
        case 17:
            ChipLogProgress(chipTool,
                " ***** Test Step 17 : 5d: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A0008")) {
                NextTest();
                return;
            }
            err = Test5dIfPaLfThReadsCurrentPositionLiftPercentageOptionalAttributeFromDut_17();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 18;

    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_ERROR Test0WaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR Test1aThSendsDownOrCloseCommandToPrepositionTheDutInTheOppositeDirection_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster downOrCloseWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"1a: TH sends DownOrClose command to preposition the DUT in the opposite direction Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1bThWaitsForXSecondsMovementsOnTheDut_2()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = mFullMotionDuration.HasValue() ? mFullMotionDuration.Value() : 6000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test1cIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"1c: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                if (value != nil) {
                }
                VerifyOrReturn(CheckConstraintNotValue("currentPositionLiftPercent100ths", value, 0U));

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2aThSendsGoToLiftPercentageCommandWith25PercentToDut_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRWindowCoveringClusterGoToLiftPercentageParams alloc] init];
        params.liftPercent100thsValue = [NSNumber numberWithUnsignedShort:2500U];
        [cluster goToLiftPercentageWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"2a: TH sends GoToLiftPercentage command with 25 percent to DUT Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2bDutUpdatesItsAttributes_5()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test2cIfPaLfThReadsTargetPositionLiftPercent100thsAttributeFromDut_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"2c: If (PA & LF) TH reads TargetPositionLiftPercent100ths attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("TargetPositionLiftPercent100ths", actualValue));
                VerifyOrReturn(CheckValue("TargetPositionLiftPercent100ths", actualValue, 2500U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3aThSetATimeoutOfXMinutesForFailure_7()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = mFullMotionDuration.HasValue() ? mFullMotionDuration.Value() : 6000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test3bThReadsOperationalStatusAttributeFromDut_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3b: TH reads OperationalStatus attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OperationalStatus", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3cIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"3c: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                {
                    id actualValue = value;
                    VerifyOrReturn(CheckValueNonNull("CurrentPositionLiftPercent100ths", actualValue));
                    VerifyOrReturn(CheckValue("CurrentPositionLiftPercent100ths", actualValue, 2500U));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3dIfPaLfThReadsCurrentPositionLiftPercentageOptionalAttributeFromDut_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionLiftPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3d: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentPositionLiftPercentage", actualValue));
                VerifyOrReturn(CheckValue("CurrentPositionLiftPercentage", actualValue, 25U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test4aThSendsGoToLiftPercentageCommandWith7520PercentToDut_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRWindowCoveringClusterGoToLiftPercentageParams alloc] init];
        params.liftPercent100thsValue = [NSNumber numberWithUnsignedShort:7520U];
        [cluster goToLiftPercentageWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"4a: TH sends GoToLiftPercentage command with 75.20 percent to DUT Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test4bDutUpdatesItsAttributes_12()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test4cIfPaLfThReadsTargetPositionLiftPercent100thsAttributeFromDut_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"4c: If (PA & LF) TH reads TargetPositionLiftPercent100ths attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("TargetPositionLiftPercent100ths", actualValue));
                VerifyOrReturn(CheckValue("TargetPositionLiftPercent100ths", actualValue, 7520U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test5aThWaitsForXSecondsMovementsOnTheDut_14()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = mFullMotionDuration.HasValue() ? mFullMotionDuration.Value() : 6000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test5bThReadsOperationalStatusAttributeFromDut_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"5b: TH reads OperationalStatus attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OperationalStatus", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test5cIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"5c: If (PA & LF) TH reads CurrentPositionLiftPercent100ths attribute from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                {
                    id actualValue = value;
                    VerifyOrReturn(CheckValueNonNull("CurrentPositionLiftPercent100ths", actualValue));
                    VerifyOrReturn(CheckValue("CurrentPositionLiftPercent100ths", actualValue, 7520U));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test5dIfPaLfThReadsCurrentPositionLiftPercentageOptionalAttributeFromDut_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionLiftPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"5d: If (PA & LF) TH reads CurrentPositionLiftPercentage optional attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentPositionLiftPercentage", actualValue));
                VerifyOrReturn(CheckValue("CurrentPositionLiftPercentage", actualValue, 75U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_4_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_WNCV_4_2()
        : TestCommandBridge("Test_TC_WNCV_4_2")
        , mTestIndex(0)
    {
        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);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_WNCV_4_2() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_WNCV_4_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_WNCV_4_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : 0: Wait for the commissioned device to be retrieved\n");
            err = Test0WaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool,
                " ***** Test Step 1 : 1a: TH sends DownOrClose command to preposition the DUT in the opposite direction\n");
            if (ShouldSkip("WNCV.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = Test1aThSendsDownOrCloseCommandToPrepositionTheDutInTheOppositeDirection_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : 1b: TH waits for x seconds movement(s) on the DUT\n");
            err = Test1bThWaitsForXSecondsMovementsOnTheDut_2();
            break;
        case 3:
            ChipLogProgress(
                chipTool, " ***** Test Step 3 : 1c: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f")) {
                NextTest();
                return;
            }
            err = Test1cIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : 2a: TH sends GoToTiltPercentage command with 30 percent to DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = Test2aThSendsGoToTiltPercentageCommandWith30PercentToDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : 2b: DUT updates its attributes\n");
            err = Test2bDutUpdatesItsAttributes_5();
            break;
        case 6:
            ChipLogProgress(
                chipTool, " ***** Test Step 6 : 2c: If (PA & TL) TH reads TargetPositionTiltPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000c")) {
                NextTest();
                return;
            }
            err = Test2cIfPaTlThReadsTargetPositionTiltPercent100thsAttributeFromDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : 3a: TH set a timeout of X minutes for failure\n");
            err = Test3aThSetATimeoutOfXMinutesForFailure_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : 3b: TH reads OperationalStatus attribute from DUT\n");
            if (ShouldSkip("WNCV.S.A000a")) {
                NextTest();
                return;
            }
            err = Test3bThReadsOperationalStatusAttributeFromDut_8();
            break;
        case 9:
            ChipLogProgress(
                chipTool, " ***** Test Step 9 : 3c: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f")) {
                NextTest();
                return;
            }
            err = Test3cIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool,
                " ***** Test Step 10 : 3d: If (PA & TL) TH reads CurrentPositionTiltPercentage optional attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A0009")) {
                NextTest();
                return;
            }
            err = Test3dIfPaTlThReadsCurrentPositionTiltPercentageOptionalAttributeFromDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : 4a: TH sends GoToTiltPercentage command with 60.05 percent to DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = Test4aThSendsGoToTiltPercentageCommandWith6005PercentToDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : 4b: DUT updates its attributes\n");
            err = Test4bDutUpdatesItsAttributes_12();
            break;
        case 13:
            ChipLogProgress(
                chipTool, " ***** Test Step 13 : 4c: If (PA & TL) TH reads TargetPositionTiltPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000c")) {
                NextTest();
                return;
            }
            err = Test4cIfPaTlThReadsTargetPositionTiltPercent100thsAttributeFromDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : 5a: TH waits for x seconds movement(s) on the DUT\n");
            err = Test5aThWaitsForXSecondsMovementsOnTheDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : 5b: TH reads OperationalStatus attribute from DUT\n");
            if (ShouldSkip("WNCV.S.A000a")) {
                NextTest();
                return;
            }
            err = Test5bThReadsOperationalStatusAttributeFromDut_15();
            break;
        case 16:
            ChipLogProgress(
                chipTool, " ***** Test Step 16 : 5c: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f")) {
                NextTest();
                return;
            }
            err = Test5cIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_16();
            break;
        case 17:
            ChipLogProgress(chipTool,
                " ***** Test Step 17 : 5d: If (PA & TL) TH reads CurrentPositionTiltPercentage optional attribute from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A0009")) {
                NextTest();
                return;
            }
            err = Test5dIfPaTlThReadsCurrentPositionTiltPercentageOptionalAttributeFromDut_17();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 18;

    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_ERROR Test0WaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR Test1aThSendsDownOrCloseCommandToPrepositionTheDutInTheOppositeDirection_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster downOrCloseWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"1a: TH sends DownOrClose command to preposition the DUT in the opposite direction Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1bThWaitsForXSecondsMovementsOnTheDut_2()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = mFullMotionDuration.HasValue() ? mFullMotionDuration.Value() : 6000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test1cIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"1c: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                if (value != nil) {
                }
                VerifyOrReturn(CheckConstraintNotValue("currentPositionTiltPercent100ths", value, 0U));

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2aThSendsGoToTiltPercentageCommandWith30PercentToDut_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRWindowCoveringClusterGoToTiltPercentageParams alloc] init];
        params.tiltPercent100thsValue = [NSNumber numberWithUnsignedShort:3000U];
        [cluster goToTiltPercentageWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"2a: TH sends GoToTiltPercentage command with 30 percent to DUT Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2bDutUpdatesItsAttributes_5()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test2cIfPaTlThReadsTargetPositionTiltPercent100thsAttributeFromDut_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"2c: If (PA & TL) TH reads TargetPositionTiltPercent100ths attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("TargetPositionTiltPercent100ths", actualValue));
                VerifyOrReturn(CheckValue("TargetPositionTiltPercent100ths", actualValue, 3000U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3aThSetATimeoutOfXMinutesForFailure_7()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = mFullMotionDuration.HasValue() ? mFullMotionDuration.Value() : 6000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test3bThReadsOperationalStatusAttributeFromDut_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3b: TH reads OperationalStatus attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OperationalStatus", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3cIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"3c: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                {
                    id actualValue = value;
                    VerifyOrReturn(CheckValueNonNull("CurrentPositionTiltPercent100ths", actualValue));
                    VerifyOrReturn(CheckValue("CurrentPositionTiltPercent100ths", actualValue, 3000U));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3dIfPaTlThReadsCurrentPositionTiltPercentageOptionalAttributeFromDut_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionTiltPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"3d: If (PA & TL) TH reads CurrentPositionTiltPercentage optional attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentPositionTiltPercentage", actualValue));
                VerifyOrReturn(CheckValue("CurrentPositionTiltPercentage", actualValue, 30U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test4aThSendsGoToTiltPercentageCommandWith6005PercentToDut_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRWindowCoveringClusterGoToTiltPercentageParams alloc] init];
        params.tiltPercent100thsValue = [NSNumber numberWithUnsignedShort:6005U];
        [cluster goToTiltPercentageWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"4a: TH sends GoToTiltPercentage command with 60.05 percent to DUT Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test4bDutUpdatesItsAttributes_12()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test4cIfPaTlThReadsTargetPositionTiltPercent100thsAttributeFromDut_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"4c: If (PA & TL) TH reads TargetPositionTiltPercent100ths attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("TargetPositionTiltPercent100ths", actualValue));
                VerifyOrReturn(CheckValue("TargetPositionTiltPercent100ths", actualValue, 6005U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test5aThWaitsForXSecondsMovementsOnTheDut_14()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = mFullMotionDuration.HasValue() ? mFullMotionDuration.Value() : 6000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test5bThReadsOperationalStatusAttributeFromDut_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"5b: TH reads OperationalStatus attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OperationalStatus", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test5cIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"5c: If (PA & TL) TH reads CurrentPositionTiltPercent100ths attribute from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                {
                    id actualValue = value;
                    VerifyOrReturn(CheckValueNonNull("CurrentPositionTiltPercent100ths", actualValue));
                    VerifyOrReturn(CheckValue("CurrentPositionTiltPercent100ths", actualValue, 6005U));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test5dIfPaTlThReadsCurrentPositionTiltPercentageOptionalAttributeFromDut_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionTiltPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"5d: If (PA & TL) TH reads CurrentPositionTiltPercentage optional attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentPositionTiltPercentage", actualValue));
                VerifyOrReturn(CheckValue("CurrentPositionTiltPercentage", actualValue, 60U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_4_3 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_WNCV_4_3()
        : TestCommandBridge("Test_TC_WNCV_4_3")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_WNCV_4_3() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_WNCV_4_3\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_WNCV_4_3\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : 0: Wait for the commissioned device to be retrieved\n");
            err = Test0WaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(
                chipTool, " ***** Test Step 1 : 1a: If (PA_LF & LF) TH reads CurrentPositionLiftPercent100ths from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e")) {
                NextTest();
                return;
            }
            err = Test1aIfPaLfLfThReadsCurrentPositionLiftPercent100thsFromDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool,
                " ***** Test Step 2 : 1b 1c: If (PA_LF & LF) TH reads CurrentPositionLiftPercentage from DUT + assert "
                "CurrentPositionLiftPercent100ths/100 equals CurrentPositionLiftPercentage\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A0008 && WNCV.S.A000e")) {
                NextTest();
                return;
            }
            err = Test1b1cIfPaLfLfThReadsCurrentPositionLiftPercentageFromDutAssertCurrentPositionLiftPercent100ths100EqualsCurrentPositionLiftPercentage_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : 2b: TH sends GoToLiftPercentage command with BadParam to DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 || WNCV.S.F00 && WNCV.S.C05.Rsp")) {
                NextTest();
                return;
            }
            err = Test2bThSendsGoToLiftPercentageCommandWithBadParamToDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : 3a: TH sends GoToLiftPercentage command with 10001 to DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 || WNCV.S.F00 && WNCV.S.C05.Rsp")) {
                NextTest();
                return;
            }
            err = Test3aThSendsGoToLiftPercentageCommandWith10001ToDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : 4a: TH sends GoToLiftPercentage command with 0xFFFF to DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 || WNCV.S.F00 && WNCV.S.C05.Rsp")) {
                NextTest();
                return;
            }
            err = Test4aThSendsGoToLiftPercentageCommandWith0xFFFFToDut_5();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), 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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 6;

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

    CHIP_ERROR Test0WaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }
    NSNumber * _Nullable attrCurrentPositionLiftPercent100ths;

    CHIP_ERROR Test1aIfPaLfLfThReadsCurrentPositionLiftPercent100thsFromDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"1a: If (PA_LF & LF) TH reads CurrentPositionLiftPercent100ths from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                if (value != nil) {

                    VerifyOrReturn(CheckConstraintMinValue<chip::Percent100ths>(
                        "currentPositionLiftPercent100ths", [value unsignedShortValue], 0U));
                    VerifyOrReturn(CheckConstraintMaxValue<chip::Percent100ths>(
                        "currentPositionLiftPercent100ths", [value unsignedShortValue], 10000U));
                }
                {
                    attrCurrentPositionLiftPercent100ths = value;
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    Test1b1cIfPaLfLfThReadsCurrentPositionLiftPercentageFromDutAssertCurrentPositionLiftPercent100ths100EqualsCurrentPositionLiftPercentage_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionLiftPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"1b 1c: If (PA_LF & LF) TH reads CurrentPositionLiftPercentage from DUT + assert "
                  @"CurrentPositionLiftPercent100ths/100 equals CurrentPositionLiftPercentage Error: %@",
                err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentPositionLiftPercentage", actualValue));
                VerifyOrReturn(CheckValue("CurrentPositionLiftPercentage", actualValue,
                    [attrCurrentPositionLiftPercent100ths unsignedShortValue] / 100U));
            }
            if (value != nil) {

                VerifyOrReturn(
                    CheckConstraintMinValue<chip::Percent>("currentPositionLiftPercentage", [value unsignedCharValue], 0U));
                VerifyOrReturn(
                    CheckConstraintMaxValue<chip::Percent>("currentPositionLiftPercentage", [value unsignedCharValue], 100U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2bThSendsGoToLiftPercentageCommandWithBadParamToDut_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRWindowCoveringClusterGoToLiftPercentageParams alloc] init];
        params.liftPercent100thsValue = [NSNumber numberWithUnsignedShort:12288U];
        [cluster goToLiftPercentageWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"2b: TH sends GoToLiftPercentage command with BadParam to DUT Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3aThSendsGoToLiftPercentageCommandWith10001ToDut_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRWindowCoveringClusterGoToLiftPercentageParams alloc] init];
        params.liftPercent100thsValue = [NSNumber numberWithUnsignedShort:10001U];
        [cluster goToLiftPercentageWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"3a: TH sends GoToLiftPercentage command with 10001 to DUT Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test4aThSendsGoToLiftPercentageCommandWith0xFFFFToDut_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRWindowCoveringClusterGoToLiftPercentageParams alloc] init];
        params.liftPercent100thsValue = [NSNumber numberWithUnsignedShort:65535U];
        [cluster goToLiftPercentageWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"4a: TH sends GoToLiftPercentage command with 0xFFFF to DUT Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_4_4 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_WNCV_4_4()
        : TestCommandBridge("Test_TC_WNCV_4_4")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_WNCV_4_4() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_WNCV_4_4\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_WNCV_4_4\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : 0: Wait for the commissioned device to be retrieved\n");
            err = Test0WaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(
                chipTool, " ***** Test Step 1 : 1a: If (PA_TL & TL) TH reads CurrentPositionTiltPercent100ths from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f")) {
                NextTest();
                return;
            }
            err = Test1aIfPaTlTlThReadsCurrentPositionTiltPercent100thsFromDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool,
                " ***** Test Step 2 : 1b 1c: If (PA_LF & LF) TH reads CurrentPositionTiltPercentage from DUT + assert "
                "CurrentPositionTiltPercent100ths/100 equals CurrentPositionTiltPercentage\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f && WNCV.S.A0009")) {
                NextTest();
                return;
            }
            err = Test1b1cIfPaLfLfThReadsCurrentPositionTiltPercentageFromDutAssertCurrentPositionTiltPercent100ths100EqualsCurrentPositionTiltPercentage_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : 2b: TH sends GoToTiltPercentage command with BadParam to DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 || WNCV.S.F01 && WNCV.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = Test2bThSendsGoToTiltPercentageCommandWithBadParamToDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : 3a: TH sends GoToTiltPercentage command with 10001 to DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 || WNCV.S.F01 && WNCV.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = Test3aThSendsGoToTiltPercentageCommandWith10001ToDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : 4a: TH sends GoToTiltPercentage command with 0xFFFF to DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 || WNCV.S.F01 && WNCV.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = Test4aThSendsGoToTiltPercentageCommandWith0xFFFFToDut_5();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), 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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 6;

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

    CHIP_ERROR Test0WaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }
    NSNumber * _Nullable attrCurrentPositionTiltPercent100ths;

    CHIP_ERROR Test1aIfPaTlTlThReadsCurrentPositionTiltPercent100thsFromDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"1a: If (PA_TL & TL) TH reads CurrentPositionTiltPercent100ths from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                if (value != nil) {

                    VerifyOrReturn(CheckConstraintMinValue<chip::Percent100ths>(
                        "currentPositionTiltPercent100ths", [value unsignedShortValue], 0U));
                    VerifyOrReturn(CheckConstraintMaxValue<chip::Percent100ths>(
                        "currentPositionTiltPercent100ths", [value unsignedShortValue], 10000U));
                }
                {
                    attrCurrentPositionTiltPercent100ths = value;
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    Test1b1cIfPaLfLfThReadsCurrentPositionTiltPercentageFromDutAssertCurrentPositionTiltPercent100ths100EqualsCurrentPositionTiltPercentage_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionTiltPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"1b 1c: If (PA_LF & LF) TH reads CurrentPositionTiltPercentage from DUT + assert "
                  @"CurrentPositionTiltPercent100ths/100 equals CurrentPositionTiltPercentage Error: %@",
                err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentPositionTiltPercentage", actualValue));
                VerifyOrReturn(CheckValue("CurrentPositionTiltPercentage", actualValue,
                    [attrCurrentPositionTiltPercent100ths unsignedShortValue] / 100U));
            }
            if (value != nil) {

                VerifyOrReturn(
                    CheckConstraintMinValue<chip::Percent>("currentPositionTiltPercentage", [value unsignedCharValue], 0U));
                VerifyOrReturn(
                    CheckConstraintMaxValue<chip::Percent>("currentPositionTiltPercentage", [value unsignedCharValue], 100U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2bThSendsGoToTiltPercentageCommandWithBadParamToDut_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRWindowCoveringClusterGoToTiltPercentageParams alloc] init];
        params.tiltPercent100thsValue = [NSNumber numberWithUnsignedShort:12288U];
        [cluster goToTiltPercentageWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"2b: TH sends GoToTiltPercentage command with BadParam to DUT Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3aThSendsGoToTiltPercentageCommandWith10001ToDut_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRWindowCoveringClusterGoToTiltPercentageParams alloc] init];
        params.tiltPercent100thsValue = [NSNumber numberWithUnsignedShort:10001U];
        [cluster goToTiltPercentageWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"3a: TH sends GoToTiltPercentage command with 10001 to DUT Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test4aThSendsGoToTiltPercentageCommandWith0xFFFFToDut_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRWindowCoveringClusterGoToTiltPercentageParams alloc] init];
        params.tiltPercent100thsValue = [NSNumber numberWithUnsignedShort:65535U];
        [cluster goToTiltPercentageWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"4a: TH sends GoToTiltPercentage command with 0xFFFF to DUT Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_WNCV_4_5 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_WNCV_4_5()
        : TestCommandBridge("Test_TC_WNCV_4_5")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_WNCV_4_5() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_WNCV_4_5\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_WNCV_4_5\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : 0a: Wait for the commissioned device to be retrieved\n");
            err = Test0aWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : 0b: TH sends UpOrOpen command to preposition the DUT\n");
            err = Test0bThSendsUpOrOpenCommandToPrepositionTheDut_1();
            break;
        case 2:
            ChipLogProgress(
                chipTool, " ***** Test Step 2 : 1a: If (PA_LF & LF) TH sends GoToLiftPercentage command with 90%% to DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.C05.Rsp")) {
                NextTest();
                return;
            }
            err = Test1aIfPaLfLfThSendsGoToLiftPercentageCommandWith90ToDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : 1b: TH Waits for 100ms-1s\n");
            err = Test1bThWaitsFor100ms1s_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : 1c: TH sends StopMotion command to DUT\n");
            if (ShouldSkip("WNCV.S.C02.Rsp")) {
                NextTest();
                return;
            }
            err = Test1cThSendsStopMotionCommandToDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : 1d: TH Waits for 100ms-1s\n");
            err = Test1dThWaitsFor100ms1s_5();
            break;
        case 6:
            ChipLogProgress(
                chipTool, " ***** Test Step 6 : 2a: If (PA_TL & TL) TH sends GoToTiltPercentage command with 90%% to DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = Test2aIfPaTlTlThSendsGoToTiltPercentageCommandWith90ToDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : 2b: TH Waits for 100ms-1s\n");
            err = Test2bThWaitsFor100ms1s_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : 2c: TH sends StopMotion command to DUT\n");
            if (ShouldSkip("WNCV.S.C02.Rsp")) {
                NextTest();
                return;
            }
            err = Test2cThSendsStopMotionCommandToDut_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : 2d: TH Waits for 100ms-1s\n");
            err = Test2dThWaitsFor100ms1s_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : 3a: TH reads CurrentPositionLiftPercent100ths from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e")) {
                NextTest();
                return;
            }
            err = Test3aThReadsCurrentPositionLiftPercent100thsFromDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : 3b: TH reads CurrentPositionTiltPercent100ths from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f")) {
                NextTest();
                return;
            }
            err = Test3bThReadsCurrentPositionTiltPercent100thsFromDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : 3c: reboot/restart the DUT\n");
            if (ShouldSkip("PICS_SDK_CI_ONLY")) {
                NextTest();
                return;
            }
            err = Test3cRebootRestartTheDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Reboot target device(DUT)\n");
            if (ShouldSkip("PICS_SKIP_SAMPLE_APP")) {
                NextTest();
                return;
            }
            err = TestRebootTargetDeviceDUT_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : 3d: Wait for the commissioned device to be retrieved\n");
            err = Test3dWaitForTheCommissionedDeviceToBeRetrieved_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : 3e: TH reads CurrentPositionLiftPercent100ths from DUT\n");
            if (ShouldSkip("WNCV.S.F00 && WNCV.S.F02 && WNCV.S.A000e")) {
                NextTest();
                return;
            }
            err = Test3eThReadsCurrentPositionLiftPercent100thsFromDut_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : 3f: TH reads CurrentPositionTiltPercent100ths from DUT\n");
            if (ShouldSkip("WNCV.S.F01 && WNCV.S.F04 && WNCV.S.A000f")) {
                NextTest();
                return;
            }
            err = Test3fThReadsCurrentPositionTiltPercent100thsFromDut_16();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 17;

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

    CHIP_ERROR Test0aWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR Test0bThSendsUpOrOpenCommandToPrepositionTheDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster upOrOpenWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"0b: TH sends UpOrOpen command to preposition the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1aIfPaLfLfThSendsGoToLiftPercentageCommandWith90ToDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRWindowCoveringClusterGoToLiftPercentageParams alloc] init];
        params.liftPercent100thsValue = [NSNumber numberWithUnsignedShort:9000U];
        [cluster
            goToLiftPercentageWithParams:params
                              completion:^(NSError * _Nullable err) {
                                  NSLog(@"1a: If (PA_LF & LF) TH sends GoToLiftPercentage command with 90%% to DUT Error: %@", err);

                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1bThWaitsFor100ms1s_3()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 5000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test1cThSendsStopMotionCommandToDut_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster stopMotionWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"1c: TH sends StopMotion command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1dThWaitsFor100ms1s_5()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 500UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test2aIfPaTlTlThSendsGoToTiltPercentageCommandWith90ToDut_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRWindowCoveringClusterGoToTiltPercentageParams alloc] init];
        params.tiltPercent100thsValue = [NSNumber numberWithUnsignedShort:9000U];
        [cluster
            goToTiltPercentageWithParams:params
                              completion:^(NSError * _Nullable err) {
                                  NSLog(@"2a: If (PA_TL & TL) TH sends GoToTiltPercentage command with 90%% to DUT Error: %@", err);

                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2bThWaitsFor100ms1s_7()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 5000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test2cThSendsStopMotionCommandToDut_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster stopMotionWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"2c: TH sends StopMotion command to DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2dThWaitsFor100ms1s_9()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 500UL;
        return WaitForMs("alpha", value);
    }
    NSNumber * _Nullable attrCurrentPositionLiftPercent100ths;

    CHIP_ERROR Test3aThReadsCurrentPositionLiftPercent100thsFromDut_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"3a: TH reads CurrentPositionLiftPercent100ths from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                if (value != nil) {
                }
                VerifyOrReturn(CheckConstraintNotValue("currentPositionLiftPercent100ths", value, 0U));
                {
                    attrCurrentPositionLiftPercent100ths = value;
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nullable attrCurrentPositionTiltPercent100ths;

    CHIP_ERROR Test3bThReadsCurrentPositionTiltPercent100thsFromDut_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"3b: TH reads CurrentPositionTiltPercent100ths from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                if (value != nil) {
                }
                VerifyOrReturn(CheckConstraintNotValue("currentPositionTiltPercent100ths", value, 0U));
                {
                    attrCurrentPositionTiltPercent100ths = value;
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3cRebootRestartTheDut_12()
    {

        chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
        return Reboot("alpha", value);
    }

    CHIP_ERROR TestRebootTargetDeviceDUT_13()
    {

        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("alpha", value);
    }

    CHIP_ERROR Test3dWaitForTheCommissionedDeviceToBeRetrieved_14()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR Test3eThReadsCurrentPositionLiftPercent100thsFromDut_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"3e: TH reads CurrentPositionLiftPercent100ths from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                {
                    id actualValue = value;
                    if (attrCurrentPositionLiftPercent100ths == nil) {
                        VerifyOrReturn(CheckValueNull("CurrentPositionLiftPercent100ths", actualValue));
                    } else {
                        VerifyOrReturn(CheckValueNonNull("CurrentPositionLiftPercent100ths", actualValue));
                        VerifyOrReturn(
                            CheckValue("CurrentPositionLiftPercent100ths", actualValue, attrCurrentPositionLiftPercent100ths));
                    }
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3fThReadsCurrentPositionTiltPercent100thsFromDut_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"3f: TH reads CurrentPositionTiltPercent100ths from DUT Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                {
                    id actualValue = value;
                    if (attrCurrentPositionTiltPercent100ths == nil) {
                        VerifyOrReturn(CheckValueNull("CurrentPositionTiltPercent100ths", actualValue));
                    } else {
                        VerifyOrReturn(CheckValueNonNull("CurrentPositionTiltPercent100ths", actualValue));
                        VerifyOrReturn(
                            CheckValue("CurrentPositionTiltPercent100ths", actualValue, attrCurrentPositionTiltPercent100ths));
                    }
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }
};

class TV_TargetNavigatorCluster : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TV_TargetNavigatorCluster()
        : TestCommandBridge("TV_TargetNavigatorCluster")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TV_TargetNavigatorCluster() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TV_TargetNavigatorCluster\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TV_TargetNavigatorCluster\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read attribute Target Navigator list\n");
            err = TestReadAttributeTargetNavigatorList_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read attribute current navigator target\n");
            err = TestReadAttributeCurrentNavigatorTarget_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Navigate Target Request Command\n");
            err = TestNavigateTargetRequestCommand_3();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 4;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadAttributeTargetNavigatorList_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute Target Navigator list Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("TargetList", [actualValue count], static_cast<uint32_t>(2)));
                VerifyOrReturn(
                    CheckValue("Identifier", ((MTRTargetNavigatorClusterTargetInfoStruct *) actualValue[0]).identifier, 1U));
                VerifyOrReturn(CheckValueAsString(
                    "Name", ((MTRTargetNavigatorClusterTargetInfoStruct *) actualValue[0]).name, @"exampleName"));
                VerifyOrReturn(
                    CheckValue("Identifier", ((MTRTargetNavigatorClusterTargetInfoStruct *) actualValue[1]).identifier, 2U));
                VerifyOrReturn(CheckValueAsString(
                    "Name", ((MTRTargetNavigatorClusterTargetInfoStruct *) actualValue[1]).name, @"exampleName"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeCurrentNavigatorTarget_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentTargetWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute current navigator target Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentTarget", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestNavigateTargetRequestCommand_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRTargetNavigatorClusterNavigateTargetParams alloc] init];
        params.target = [NSNumber numberWithUnsignedChar:1U];
        params.data = @"1";
        [cluster navigateTargetWithParams:params
                               completion:^(MTRTargetNavigatorClusterNavigateTargetResponseParams * _Nullable values,
                                   NSError * _Nullable err) {
                                   NSLog(@"Navigate Target Request Command Error: %@", err);

                                   VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                   {
                                       id actualValue = values.status;
                                       VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                                   }

                                   {
                                       id actualValue = values.data;
                                       VerifyOrReturn(CheckValueAsString("Data", actualValue, @"data response"));
                                   }

                                   NextTest();
                               }];

        return CHIP_NO_ERROR;
    }
};

class TV_AudioOutputCluster : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TV_AudioOutputCluster()
        : TestCommandBridge("TV_AudioOutputCluster")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TV_AudioOutputCluster() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TV_AudioOutputCluster\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TV_AudioOutputCluster\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read attribute Audio Output list\n");
            err = TestReadAttributeAudioOutputList_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read attribute current audio output\n");
            err = TestReadAttributeCurrentAudioOutput_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Select Output Command\n");
            err = TestSelectOutputCommand_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Rename Output Command\n");
            err = TestRenameOutputCommand_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read attribute Audio Output list\n");
            err = TestReadAttributeAudioOutputList_5();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 6;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadAttributeAudioOutputList_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOutputListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute Audio Output list Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OutputList", [actualValue count], static_cast<uint32_t>(3)));
                VerifyOrReturn(CheckValue("Index", ((MTRAudioOutputClusterOutputInfoStruct *) actualValue[0]).index, 1U));
                VerifyOrReturn(CheckValue("OutputType", ((MTRAudioOutputClusterOutputInfoStruct *) actualValue[0]).outputType, 0U));
                VerifyOrReturn(
                    CheckValueAsString("Name", ((MTRAudioOutputClusterOutputInfoStruct *) actualValue[0]).name, @"HDMI"));
                VerifyOrReturn(CheckValue("Index", ((MTRAudioOutputClusterOutputInfoStruct *) actualValue[1]).index, 2U));
                VerifyOrReturn(CheckValue("OutputType", ((MTRAudioOutputClusterOutputInfoStruct *) actualValue[1]).outputType, 0U));
                VerifyOrReturn(
                    CheckValueAsString("Name", ((MTRAudioOutputClusterOutputInfoStruct *) actualValue[1]).name, @"HDMI"));
                VerifyOrReturn(CheckValue("Index", ((MTRAudioOutputClusterOutputInfoStruct *) actualValue[2]).index, 3U));
                VerifyOrReturn(CheckValue("OutputType", ((MTRAudioOutputClusterOutputInfoStruct *) actualValue[2]).outputType, 0U));
                VerifyOrReturn(
                    CheckValueAsString("Name", ((MTRAudioOutputClusterOutputInfoStruct *) actualValue[2]).name, @"HDMI"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeCurrentAudioOutput_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentOutputWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute current audio output Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentOutput", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSelectOutputCommand_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRAudioOutputClusterSelectOutputParams alloc] init];
        params.index = [NSNumber numberWithUnsignedChar:1U];
        [cluster selectOutputWithParams:params
                             completion:^(NSError * _Nullable err) {
                                 NSLog(@"Select Output Command Error: %@", err);

                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                 NextTest();
                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRenameOutputCommand_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRAudioOutputClusterRenameOutputParams alloc] init];
        params.index = [NSNumber numberWithUnsignedChar:1U];
        params.name = @"HDMI Test";
        [cluster renameOutputWithParams:params
                             completion:^(NSError * _Nullable err) {
                                 NSLog(@"Rename Output Command Error: %@", err);

                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                 NextTest();
                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeAudioOutputList_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOutputListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute Audio Output list Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OutputList", [actualValue count], static_cast<uint32_t>(3)));
                VerifyOrReturn(CheckValue("Index", ((MTRAudioOutputClusterOutputInfoStruct *) actualValue[0]).index, 1U));
                VerifyOrReturn(CheckValue("OutputType", ((MTRAudioOutputClusterOutputInfoStruct *) actualValue[0]).outputType, 0U));
                VerifyOrReturn(
                    CheckValueAsString("Name", ((MTRAudioOutputClusterOutputInfoStruct *) actualValue[0]).name, @"HDMI Test"));
                VerifyOrReturn(CheckValue("Index", ((MTRAudioOutputClusterOutputInfoStruct *) actualValue[1]).index, 2U));
                VerifyOrReturn(CheckValue("OutputType", ((MTRAudioOutputClusterOutputInfoStruct *) actualValue[1]).outputType, 0U));
                VerifyOrReturn(
                    CheckValueAsString("Name", ((MTRAudioOutputClusterOutputInfoStruct *) actualValue[1]).name, @"HDMI"));
                VerifyOrReturn(CheckValue("Index", ((MTRAudioOutputClusterOutputInfoStruct *) actualValue[2]).index, 3U));
                VerifyOrReturn(CheckValue("OutputType", ((MTRAudioOutputClusterOutputInfoStruct *) actualValue[2]).outputType, 0U));
                VerifyOrReturn(
                    CheckValueAsString("Name", ((MTRAudioOutputClusterOutputInfoStruct *) actualValue[2]).name, @"HDMI"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class TV_ApplicationLauncherCluster : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TV_ApplicationLauncherCluster()
        : TestCommandBridge("TV_ApplicationLauncherCluster")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TV_ApplicationLauncherCluster() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TV_ApplicationLauncherCluster\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TV_ApplicationLauncherCluster\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read attribute Application Launcher list\n");
            err = TestReadAttributeApplicationLauncherList_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read attribute application launcher app\n");
            err = TestReadAttributeApplicationLauncherApp_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Launch App Command\n");
            err = TestLaunchAppCommand_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Stop App Command\n");
            err = TestStopAppCommand_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Hide App Command\n");
            err = TestHideAppCommand_5();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 6;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadAttributeApplicationLauncherList_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCatalogListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute Application Launcher list Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CatalogList", [actualValue count], static_cast<uint32_t>(2)));
                VerifyOrReturn(CheckValue("", actualValue[0], 123U));
                VerifyOrReturn(CheckValue("", actualValue[1], 456U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeApplicationLauncherApp_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentAppWithCompletion:^(
            MTRApplicationLauncherClusterApplicationEPStruct * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute application launcher app Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("CurrentApp", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestLaunchAppCommand_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRApplicationLauncherClusterLaunchAppParams alloc] init];
        params.application = [[MTRApplicationLauncherClusterApplicationStruct alloc] init];
        ((MTRApplicationLauncherClusterApplicationStruct *) params.application).catalogVendorID =
            [NSNumber numberWithUnsignedShort:123U];
        ((MTRApplicationLauncherClusterApplicationStruct *) params.application).applicationID = @"applicationId";

        params.data = [[NSData alloc] initWithBytes:"data" length:4];
        [cluster
            launchAppWithParams:params
                     completion:^(MTRApplicationLauncherClusterLauncherResponseParams * _Nullable values, NSError * _Nullable err) {
                         NSLog(@"Launch App Command Error: %@", err);

                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                         {
                             id actualValue = values.status;
                             VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                         }

                         {
                             id actualValue = values.data;
                             VerifyOrReturn(
                                 CheckValueAsString("Data", actualValue, [[NSData alloc] initWithBytes:"data" length:4]));
                         }

                         NextTest();
                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestStopAppCommand_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRApplicationLauncherClusterStopAppParams alloc] init];
        params.application = [[MTRApplicationLauncherClusterApplicationStruct alloc] init];
        ((MTRApplicationLauncherClusterApplicationStruct *) params.application).catalogVendorID =
            [NSNumber numberWithUnsignedShort:123U];
        ((MTRApplicationLauncherClusterApplicationStruct *) params.application).applicationID = @"applicationId";

        [cluster
            stopAppWithParams:params
                   completion:^(MTRApplicationLauncherClusterLauncherResponseParams * _Nullable values, NSError * _Nullable err) {
                       NSLog(@"Stop App Command Error: %@", err);

                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                       {
                           id actualValue = values.status;
                           VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                       }

                       {
                           id actualValue = values.data;
                           VerifyOrReturn(CheckValueAsString("Data", actualValue, [[NSData alloc] initWithBytes:"data" length:4]));
                       }

                       NextTest();
                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestHideAppCommand_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRApplicationLauncherClusterHideAppParams alloc] init];
        params.application = [[MTRApplicationLauncherClusterApplicationStruct alloc] init];
        ((MTRApplicationLauncherClusterApplicationStruct *) params.application).catalogVendorID =
            [NSNumber numberWithUnsignedShort:123U];
        ((MTRApplicationLauncherClusterApplicationStruct *) params.application).applicationID = @"applicationId";

        [cluster
            hideAppWithParams:params
                   completion:^(MTRApplicationLauncherClusterLauncherResponseParams * _Nullable values, NSError * _Nullable err) {
                       NSLog(@"Hide App Command Error: %@", err);

                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                       {
                           id actualValue = values.status;
                           VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                       }

                       {
                           id actualValue = values.data;
                           VerifyOrReturn(CheckValueAsString("Data", actualValue, [[NSData alloc] initWithBytes:"data" length:4]));
                       }

                       NextTest();
                   }];

        return CHIP_NO_ERROR;
    }
};

class TV_KeypadInputCluster : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TV_KeypadInputCluster()
        : TestCommandBridge("TV_KeypadInputCluster")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TV_KeypadInputCluster() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TV_KeypadInputCluster\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TV_KeypadInputCluster\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Send Key Command\n");
            err = TestSendKeyCommand_1();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 2;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestSendKeyCommand_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
        params.keyCode = [NSNumber numberWithUnsignedChar:3U];
        [cluster sendKeyWithParams:params
                        completion:^(MTRKeypadInputClusterSendKeyResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Send Key Command Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.status;
                                VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }
};

class TV_AccountLoginCluster : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TV_AccountLoginCluster()
        : TestCommandBridge("TV_AccountLoginCluster")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TV_AccountLoginCluster() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TV_AccountLoginCluster\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TV_AccountLoginCluster\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Get Setup PIN Command\n");
            err = TestGetSetupPinCommand_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Login Command\n");
            err = TestLoginCommand_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Logout Command\n");
            err = TestLogoutCommand_3();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 4;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestGetSetupPinCommand_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRAccountLoginClusterGetSetupPINParams alloc] init];
        params.tempAccountIdentifier = @"asdf";
        [cluster
            getSetupPINWithParams:params
                       completion:^(MTRAccountLoginClusterGetSetupPINResponseParams * _Nullable values, NSError * _Nullable err) {
                           NSLog(@"Get Setup PIN Command Error: %@", err);

                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                           {
                               id actualValue = values.setupPIN;
                               VerifyOrReturn(CheckValueAsString("SetupPIN", actualValue, @"tempPin123"));
                           }

                           NextTest();
                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestLoginCommand_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRAccountLoginClusterLoginParams alloc] init];
        params.tempAccountIdentifier = @"asdf";
        params.setupPIN = @"tempPin123";
        [cluster loginWithParams:params
                      completion:^(NSError * _Nullable err) {
                          NSLog(@"Login Command Error: %@", err);

                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                          NextTest();
                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestLogoutCommand_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster logoutWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Logout Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class TV_WakeOnLanCluster : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TV_WakeOnLanCluster()
        : TestCommandBridge("TV_WakeOnLanCluster")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TV_WakeOnLanCluster() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TV_WakeOnLanCluster\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TV_WakeOnLanCluster\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read mac address\n");
            err = TestReadMacAddress_1();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 2;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadMacAddress_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterWakeOnLAN alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMACAddressWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read mac address Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("MACAddress", actualValue, @"00:00:00:00:00"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class TV_ApplicationBasicCluster : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TV_ApplicationBasicCluster()
        : TestCommandBridge("TV_ApplicationBasicCluster")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TV_ApplicationBasicCluster() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TV_ApplicationBasicCluster\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TV_ApplicationBasicCluster\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read attribute vendor name\n");
            err = TestReadAttributeVendorName_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read attribute vendor id\n");
            err = TestReadAttributeVendorId_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read attribute application name\n");
            err = TestReadAttributeApplicationName_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read attribute product id\n");
            err = TestReadAttributeProductId_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read attribute application status\n");
            err = TestReadAttributeApplicationStatus_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read attribute application status\n");
            err = TestReadAttributeApplicationStatus_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read attribute application version\n");
            err = TestReadAttributeApplicationVersion_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read attribute application allowed vendor list\n");
            err = TestReadAttributeApplicationAllowedVendorList_8();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 9;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadAttributeVendorName_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeVendorNameWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute vendor name Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("VendorName", actualValue, @"exampleVendorName1"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeVendorId_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeVendorIDWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute vendor id Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("VendorID", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeApplicationName_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeApplicationNameWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute application name Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("ApplicationName", actualValue, @"exampleName1"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeProductId_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeProductIDWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute product id Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ProductID", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeApplicationStatus_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute application status Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("Status", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeApplicationStatus_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeApplicationWithCompletion:^(
            MTRApplicationBasicClusterApplicationStruct * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute application status Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue(
                    "CatalogVendorID", ((MTRApplicationBasicClusterApplicationStruct *) actualValue).catalogVendorID, 123U));
                VerifyOrReturn(CheckValueAsString("ApplicationID",
                    ((MTRApplicationBasicClusterApplicationStruct *) actualValue).applicationID, @"applicationId"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeApplicationVersion_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeApplicationVersionWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute application version Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("ApplicationVersion", actualValue, @"exampleVersion"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeApplicationAllowedVendorList_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAllowedVendorListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute application allowed vendor list Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AllowedVendorList", [actualValue count], static_cast<uint32_t>(2)));
                VerifyOrReturn(CheckValue("", actualValue[0], 1U));
                VerifyOrReturn(CheckValue("", actualValue[1], 456U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class TV_MediaPlaybackCluster : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TV_MediaPlaybackCluster()
        : TestCommandBridge("TV_MediaPlaybackCluster")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TV_MediaPlaybackCluster() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TV_MediaPlaybackCluster\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TV_MediaPlaybackCluster\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read attribute playback state\n");
            err = TestReadAttributePlaybackState_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read attribute start time\n");
            err = TestReadAttributeStartTime_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read attribute duration\n");
            err = TestReadAttributeDuration_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read attribute position\n");
            err = TestReadAttributePosition_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read attribute playback speed\n");
            err = TestReadAttributePlaybackSpeed_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read attribute seek range end\n");
            err = TestReadAttributeSeekRangeEnd_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read attribute seek range start\n");
            err = TestReadAttributeSeekRangeStart_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Media Playback Play Command\n");
            err = TestMediaPlaybackPlayCommand_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Media Playback Pause Command\n");
            err = TestMediaPlaybackPauseCommand_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Media Playback Stop Command\n");
            err = TestMediaPlaybackStopCommand_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Media Playback Start Over Command\n");
            err = TestMediaPlaybackStartOverCommand_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Media Playback Previous Command\n");
            err = TestMediaPlaybackPreviousCommand_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Media Playback Next Command\n");
            err = TestMediaPlaybackNextCommand_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Media Playback Rewind Command\n");
            err = TestMediaPlaybackRewindCommand_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Media Playback Fast Forward Command\n");
            err = TestMediaPlaybackFastForwardCommand_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Media Playback Skip Forward Command\n");
            err = TestMediaPlaybackSkipForwardCommand_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Read attribute position after skip forward\n");
            err = TestReadAttributePositionAfterSkipForward_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Media Playback Skip Backward Command\n");
            err = TestMediaPlaybackSkipBackwardCommand_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Read attribute position after skip backward\n");
            err = TestReadAttributePositionAfterSkipBackward_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Media Playback Seek Command\n");
            err = TestMediaPlaybackSeekCommand_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Read attribute position after seek\n");
            err = TestReadAttributePositionAfterSeek_21();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 22;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadAttributePlaybackState_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute playback state Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentState", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeStartTime_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeStartTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute start time Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("StartTime", actualValue));
                VerifyOrReturn(CheckValue("StartTime", actualValue, 0ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeDuration_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeDurationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute duration Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("Duration", actualValue));
                VerifyOrReturn(CheckValue("Duration", actualValue, 80000ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributePosition_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSampledPositionWithCompletion:^(
            MTRMediaPlaybackClusterPlaybackPositionStruct * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute position Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("SampledPosition", actualValue));
                VerifyOrReturn(
                    CheckValue("UpdatedAt", ((MTRMediaPlaybackClusterPlaybackPositionStruct *) actualValue).updatedAt, 0ULL));
                VerifyOrReturn(
                    CheckValueNonNull("Position", ((MTRMediaPlaybackClusterPlaybackPositionStruct *) actualValue).position));
                VerifyOrReturn(
                    CheckValue("Position", ((MTRMediaPlaybackClusterPlaybackPositionStruct *) actualValue).position, 0ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributePlaybackSpeed_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePlaybackSpeedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute playback speed Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("PlaybackSpeed", actualValue, 0.0f));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeSeekRangeEnd_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSeekRangeEndWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute seek range end Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("SeekRangeEnd", actualValue));
                VerifyOrReturn(CheckValue("SeekRangeEnd", actualValue, 80000ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeSeekRangeStart_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSeekRangeStartWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute seek range start Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("SeekRangeStart", actualValue));
                VerifyOrReturn(CheckValue("SeekRangeStart", actualValue, 0ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMediaPlaybackPlayCommand_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster playWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
            NSLog(@"Media Playback Play Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = values.status;
                VerifyOrReturn(CheckValue("Status", actualValue, 0U));
            }

            {
                id actualValue = values.data;
                VerifyOrReturn(CheckValueAsString("Data", actualValue, @"data response"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMediaPlaybackPauseCommand_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster pauseWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
            NSLog(@"Media Playback Pause Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = values.status;
                VerifyOrReturn(CheckValue("Status", actualValue, 0U));
            }

            {
                id actualValue = values.data;
                VerifyOrReturn(CheckValueAsString("Data", actualValue, @"data response"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMediaPlaybackStopCommand_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster stopWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
            NSLog(@"Media Playback Stop Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = values.status;
                VerifyOrReturn(CheckValue("Status", actualValue, 0U));
            }

            {
                id actualValue = values.data;
                VerifyOrReturn(CheckValueAsString("Data", actualValue, @"data response"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMediaPlaybackStartOverCommand_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            startOverWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
                NSLog(@"Media Playback Start Over Command Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                {
                    id actualValue = values.status;
                    VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                }

                {
                    id actualValue = values.data;
                    VerifyOrReturn(CheckValueAsString("Data", actualValue, @"data response"));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMediaPlaybackPreviousCommand_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            previousWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
                NSLog(@"Media Playback Previous Command Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                {
                    id actualValue = values.status;
                    VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                }

                {
                    id actualValue = values.data;
                    VerifyOrReturn(CheckValueAsString("Data", actualValue, @"data response"));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMediaPlaybackNextCommand_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster nextWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
            NSLog(@"Media Playback Next Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = values.status;
                VerifyOrReturn(CheckValue("Status", actualValue, 0U));
            }

            {
                id actualValue = values.data;
                VerifyOrReturn(CheckValueAsString("Data", actualValue, @"data response"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMediaPlaybackRewindCommand_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster rewindWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
            NSLog(@"Media Playback Rewind Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = values.status;
                VerifyOrReturn(CheckValue("Status", actualValue, 0U));
            }

            {
                id actualValue = values.data;
                VerifyOrReturn(CheckValueAsString("Data", actualValue, @"data response"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMediaPlaybackFastForwardCommand_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            fastForwardWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
                NSLog(@"Media Playback Fast Forward Command Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                {
                    id actualValue = values.status;
                    VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                }

                {
                    id actualValue = values.data;
                    VerifyOrReturn(CheckValueAsString("Data", actualValue, @"data response"));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMediaPlaybackSkipForwardCommand_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRMediaPlaybackClusterSkipForwardParams alloc] init];
        params.deltaPositionMilliseconds = [NSNumber numberWithUnsignedLongLong:500ULL];
        [cluster
            skipForwardWithParams:params
                       completion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
                           NSLog(@"Media Playback Skip Forward Command Error: %@", err);

                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                           {
                               id actualValue = values.status;
                               VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                           }

                           {
                               id actualValue = values.data;
                               VerifyOrReturn(CheckValueAsString("Data", actualValue, @"data response"));
                           }

                           NextTest();
                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributePositionAfterSkipForward_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSampledPositionWithCompletion:^(
            MTRMediaPlaybackClusterPlaybackPositionStruct * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute position after skip forward Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("SampledPosition", actualValue));
                VerifyOrReturn(
                    CheckValue("UpdatedAt", ((MTRMediaPlaybackClusterPlaybackPositionStruct *) actualValue).updatedAt, 0ULL));
                VerifyOrReturn(
                    CheckValueNonNull("Position", ((MTRMediaPlaybackClusterPlaybackPositionStruct *) actualValue).position));
                VerifyOrReturn(
                    CheckValue("Position", ((MTRMediaPlaybackClusterPlaybackPositionStruct *) actualValue).position, 500ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMediaPlaybackSkipBackwardCommand_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRMediaPlaybackClusterSkipBackwardParams alloc] init];
        params.deltaPositionMilliseconds = [NSNumber numberWithUnsignedLongLong:100ULL];
        [cluster
            skipBackwardWithParams:params
                        completion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Media Playback Skip Backward Command Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.status;
                                VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                            }

                            {
                                id actualValue = values.data;
                                VerifyOrReturn(CheckValueAsString("Data", actualValue, @"data response"));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributePositionAfterSkipBackward_19()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSampledPositionWithCompletion:^(
            MTRMediaPlaybackClusterPlaybackPositionStruct * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute position after skip backward Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("SampledPosition", actualValue));
                VerifyOrReturn(
                    CheckValue("UpdatedAt", ((MTRMediaPlaybackClusterPlaybackPositionStruct *) actualValue).updatedAt, 0ULL));
                VerifyOrReturn(
                    CheckValueNonNull("Position", ((MTRMediaPlaybackClusterPlaybackPositionStruct *) actualValue).position));
                VerifyOrReturn(
                    CheckValue("Position", ((MTRMediaPlaybackClusterPlaybackPositionStruct *) actualValue).position, 400ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMediaPlaybackSeekCommand_20()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRMediaPlaybackClusterSeekParams alloc] init];
        params.position = [NSNumber numberWithUnsignedLongLong:1000ULL];
        [cluster seekWithParams:params
                     completion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
                         NSLog(@"Media Playback Seek Command Error: %@", err);

                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                         {
                             id actualValue = values.status;
                             VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                         }

                         {
                             id actualValue = values.data;
                             VerifyOrReturn(CheckValueAsString("Data", actualValue, @"data response"));
                         }

                         NextTest();
                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributePositionAfterSeek_21()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSampledPositionWithCompletion:^(
            MTRMediaPlaybackClusterPlaybackPositionStruct * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute position after seek Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("SampledPosition", actualValue));
                VerifyOrReturn(
                    CheckValue("UpdatedAt", ((MTRMediaPlaybackClusterPlaybackPositionStruct *) actualValue).updatedAt, 0ULL));
                VerifyOrReturn(
                    CheckValueNonNull("Position", ((MTRMediaPlaybackClusterPlaybackPositionStruct *) actualValue).position));
                VerifyOrReturn(
                    CheckValue("Position", ((MTRMediaPlaybackClusterPlaybackPositionStruct *) actualValue).position, 1000ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class TV_ChannelCluster : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TV_ChannelCluster()
        : TestCommandBridge("TV_ChannelCluster")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TV_ChannelCluster() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TV_ChannelCluster\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TV_ChannelCluster\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read attribute Channel list\n");
            err = TestReadAttributeChannelList_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read attribute channel lineup\n");
            err = TestReadAttributeChannelLineup_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read attribute current channel\n");
            err = TestReadAttributeCurrentChannel_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Change Channel Command\n");
            err = TestChangeChannelCommand_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Change Channel By Number Command\n");
            err = TestChangeChannelByNumberCommand_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Skip Channel Command\n");
            err = TestSkipChannelCommand_6();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 7;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadAttributeChannelList_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeChannelListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute Channel list Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ChannelList", [actualValue count], static_cast<uint32_t>(4)));
                VerifyOrReturn(CheckValue("MajorNumber", ((MTRChannelClusterChannelInfoStruct *) actualValue[0]).majorNumber, 6U));
                VerifyOrReturn(CheckValue("MinorNumber", ((MTRChannelClusterChannelInfoStruct *) actualValue[0]).minorNumber, 0U));
                VerifyOrReturn(CheckValueAsString("Name", ((MTRChannelClusterChannelInfoStruct *) actualValue[0]).name, @"ABC"));
                VerifyOrReturn(
                    CheckValueAsString("CallSign", ((MTRChannelClusterChannelInfoStruct *) actualValue[0]).callSign, @"KAAL-TV"));
                VerifyOrReturn(CheckValueAsString(
                    "AffiliateCallSign", ((MTRChannelClusterChannelInfoStruct *) actualValue[0]).affiliateCallSign, @"KAAL"));
                VerifyOrReturn(CheckValue("MajorNumber", ((MTRChannelClusterChannelInfoStruct *) actualValue[1]).majorNumber, 9U));
                VerifyOrReturn(CheckValue("MinorNumber", ((MTRChannelClusterChannelInfoStruct *) actualValue[1]).minorNumber, 1U));
                VerifyOrReturn(CheckValueAsString("Name", ((MTRChannelClusterChannelInfoStruct *) actualValue[1]).name, @"PBS"));
                VerifyOrReturn(
                    CheckValueAsString("CallSign", ((MTRChannelClusterChannelInfoStruct *) actualValue[1]).callSign, @"KCTS-TV"));
                VerifyOrReturn(CheckValueAsString(
                    "AffiliateCallSign", ((MTRChannelClusterChannelInfoStruct *) actualValue[1]).affiliateCallSign, @"KCTS"));
                VerifyOrReturn(CheckValue("MajorNumber", ((MTRChannelClusterChannelInfoStruct *) actualValue[2]).majorNumber, 9U));
                VerifyOrReturn(CheckValue("MinorNumber", ((MTRChannelClusterChannelInfoStruct *) actualValue[2]).minorNumber, 2U));
                VerifyOrReturn(
                    CheckValueAsString("Name", ((MTRChannelClusterChannelInfoStruct *) actualValue[2]).name, @"PBS Kids"));
                VerifyOrReturn(
                    CheckValueAsString("CallSign", ((MTRChannelClusterChannelInfoStruct *) actualValue[2]).callSign, @"KCTS-TV"));
                VerifyOrReturn(CheckValueAsString(
                    "AffiliateCallSign", ((MTRChannelClusterChannelInfoStruct *) actualValue[2]).affiliateCallSign, @"KCTS"));
                VerifyOrReturn(CheckValue("MajorNumber", ((MTRChannelClusterChannelInfoStruct *) actualValue[3]).majorNumber, 9U));
                VerifyOrReturn(CheckValue("MinorNumber", ((MTRChannelClusterChannelInfoStruct *) actualValue[3]).minorNumber, 3U));
                VerifyOrReturn(
                    CheckValueAsString("Name", ((MTRChannelClusterChannelInfoStruct *) actualValue[3]).name, @"World Channel"));
                VerifyOrReturn(
                    CheckValueAsString("CallSign", ((MTRChannelClusterChannelInfoStruct *) actualValue[3]).callSign, @"KCTS-TV"));
                VerifyOrReturn(CheckValueAsString(
                    "AffiliateCallSign", ((MTRChannelClusterChannelInfoStruct *) actualValue[3]).affiliateCallSign, @"KCTS"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeChannelLineup_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLineupWithCompletion:^(MTRChannelClusterLineupInfoStruct * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute channel lineup Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("Lineup", actualValue));
                VerifyOrReturn(CheckValueAsString(
                    "OperatorName", ((MTRChannelClusterLineupInfoStruct *) actualValue).operatorName, @"Comcast"));
                VerifyOrReturn(CheckValueAsString(
                    "LineupName", ((MTRChannelClusterLineupInfoStruct *) actualValue).lineupName, @"Comcast King County"));
                VerifyOrReturn(
                    CheckValueAsString("PostalCode", ((MTRChannelClusterLineupInfoStruct *) actualValue).postalCode, @"98052"));
                VerifyOrReturn(
                    CheckValue("LineupInfoType", ((MTRChannelClusterLineupInfoStruct *) actualValue).lineupInfoType, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeCurrentChannel_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentChannelWithCompletion:^(
            MTRChannelClusterChannelInfoStruct * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute current channel Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentChannel", actualValue));
                VerifyOrReturn(CheckValue("MajorNumber", ((MTRChannelClusterChannelInfoStruct *) actualValue).majorNumber, 6U));
                VerifyOrReturn(CheckValue("MinorNumber", ((MTRChannelClusterChannelInfoStruct *) actualValue).minorNumber, 0U));
                VerifyOrReturn(CheckValueAsString("Name", ((MTRChannelClusterChannelInfoStruct *) actualValue).name, @"ABC"));
                VerifyOrReturn(
                    CheckValueAsString("CallSign", ((MTRChannelClusterChannelInfoStruct *) actualValue).callSign, @"KAAL-TV"));
                VerifyOrReturn(CheckValueAsString(
                    "AffiliateCallSign", ((MTRChannelClusterChannelInfoStruct *) actualValue).affiliateCallSign, @"KAAL"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestChangeChannelCommand_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRChannelClusterChangeChannelParams alloc] init];
        params.match = @"PBS";
        [cluster
            changeChannelWithParams:params
                         completion:^(MTRChannelClusterChangeChannelResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Change Channel Command Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.data;
                                 VerifyOrReturn(CheckValueAsString("Data", actualValue, @"data response"));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestChangeChannelByNumberCommand_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRChannelClusterChangeChannelByNumberParams alloc] init];
        params.majorNumber = [NSNumber numberWithUnsignedShort:6U];
        params.minorNumber = [NSNumber numberWithUnsignedShort:0U];
        [cluster changeChannelByNumberWithParams:params
                                      completion:^(NSError * _Nullable err) {
                                          NSLog(@"Change Channel By Number Command Error: %@", err);

                                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                          NextTest();
                                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSkipChannelCommand_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRChannelClusterSkipChannelParams alloc] init];
        params.count = [NSNumber numberWithUnsignedShort:1U];
        [cluster skipChannelWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"Skip Channel Command Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }
};

class TV_LowPowerCluster : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TV_LowPowerCluster()
        : TestCommandBridge("TV_LowPowerCluster")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TV_LowPowerCluster() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TV_LowPowerCluster\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TV_LowPowerCluster\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Sleep Input Status Command\n");
            err = TestSleepInputStatusCommand_1();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 2;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestSleepInputStatusCommand_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster sleepWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Sleep Input Status Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class TV_ContentLauncherCluster : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TV_ContentLauncherCluster()
        : TestCommandBridge("TV_ContentLauncherCluster")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TV_ContentLauncherCluster() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TV_ContentLauncherCluster\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TV_ContentLauncherCluster\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read attribute accept header list\n");
            err = TestReadAttributeAcceptHeaderList_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read attribute supported streaming protocols\n");
            err = TestReadAttributeSupportedStreamingProtocols_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Launch Content Command\n");
            err = TestLaunchContentCommand_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Launch URL Command\n");
            err = TestLaunchUrlCommand_4();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 5;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadAttributeAcceptHeaderList_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptHeaderWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute accept header list Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptHeader", [actualValue count], static_cast<uint32_t>(2)));
                VerifyOrReturn(CheckValueAsString("", actualValue[0], @"example"));
                VerifyOrReturn(CheckValueAsString("", actualValue[1], @"example"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeSupportedStreamingProtocols_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSupportedStreamingProtocolsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute supported streaming protocols Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("SupportedStreamingProtocols", actualValue, 0UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestLaunchContentCommand_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRContentLauncherClusterLaunchContentParams alloc] init];
        params.search = [[MTRContentLauncherClusterContentSearchStruct alloc] init];
        {
            NSMutableArray * temp_1 = [[NSMutableArray alloc] init];
            temp_1[0] = [[MTRContentLauncherClusterParameterStruct alloc] init];
            ((MTRContentLauncherClusterParameterStruct *) temp_1[0]).type = [NSNumber numberWithUnsignedChar:1U];
            ((MTRContentLauncherClusterParameterStruct *) temp_1[0]).value = @"exampleValue";
            {
                NSMutableArray * temp_4 = [[NSMutableArray alloc] init];
                temp_4[0] = [[MTRContentLauncherClusterAdditionalInfoStruct alloc] init];
                ((MTRContentLauncherClusterAdditionalInfoStruct *) temp_4[0]).name = @"name";
                ((MTRContentLauncherClusterAdditionalInfoStruct *) temp_4[0]).value = @"value";

                ((MTRContentLauncherClusterParameterStruct *) temp_1[0]).externalIDList = temp_4;
            }

            ((MTRContentLauncherClusterContentSearchStruct *) params.search).parameterList = temp_1;
        }

        params.autoPlay = [NSNumber numberWithBool:true];
        params.data = @"exampleData";
        [cluster
            launchContentWithParams:params
                         completion:^(MTRContentLauncherClusterLauncherResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Launch Content Command Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.data;
                                 VerifyOrReturn(CheckValueAsString("Data", actualValue, @"exampleData"));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestLaunchUrlCommand_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRContentLauncherClusterLaunchURLParams alloc] init];
        params.contentURL = @"exampleUrl";
        params.displayString = @"exampleDisplayString";
        params.brandingInformation = [[MTRContentLauncherClusterBrandingInformationStruct alloc] init];
        ((MTRContentLauncherClusterBrandingInformationStruct *) params.brandingInformation).providerName = @"exampleName";
        ((MTRContentLauncherClusterBrandingInformationStruct *) params.brandingInformation).background =
            [[MTRContentLauncherClusterStyleInformationStruct alloc] init];
        ((MTRContentLauncherClusterStyleInformationStruct *) ((MTRContentLauncherClusterBrandingInformationStruct *)
                                                                  params.brandingInformation)
                .background)
            .imageURL
            = @"exampleUrl";
        ((MTRContentLauncherClusterStyleInformationStruct *) ((MTRContentLauncherClusterBrandingInformationStruct *)
                                                                  params.brandingInformation)
                .background)
            .color
            = @"exampleColor";
        ((MTRContentLauncherClusterStyleInformationStruct *) ((MTRContentLauncherClusterBrandingInformationStruct *)
                                                                  params.brandingInformation)
                .background)
            .size
            = [[MTRContentLauncherClusterDimensionStruct alloc] init];
        ((MTRContentLauncherClusterDimensionStruct *) ((MTRContentLauncherClusterStyleInformationStruct *) ((MTRContentLauncherClusterBrandingInformationStruct *)
                                                                                                                params
                                                                                                                    .brandingInformation)
                                                           .background)
                .size)
            .width
            = [NSNumber numberWithDouble:0];
        ((MTRContentLauncherClusterDimensionStruct *) ((MTRContentLauncherClusterStyleInformationStruct *) ((MTRContentLauncherClusterBrandingInformationStruct *)
                                                                                                                params
                                                                                                                    .brandingInformation)
                                                           .background)
                .size)
            .height
            = [NSNumber numberWithDouble:0];
        ((MTRContentLauncherClusterDimensionStruct *) ((MTRContentLauncherClusterStyleInformationStruct *) ((MTRContentLauncherClusterBrandingInformationStruct *)
                                                                                                                params
                                                                                                                    .brandingInformation)
                                                           .background)
                .size)
            .metric
            = [NSNumber numberWithUnsignedChar:0U];

        ((MTRContentLauncherClusterBrandingInformationStruct *) params.brandingInformation).logo =
            [[MTRContentLauncherClusterStyleInformationStruct alloc] init];
        ((MTRContentLauncherClusterStyleInformationStruct *) ((MTRContentLauncherClusterBrandingInformationStruct *)
                                                                  params.brandingInformation)
                .logo)
            .imageURL
            = @"exampleUrl";
        ((MTRContentLauncherClusterStyleInformationStruct *) ((MTRContentLauncherClusterBrandingInformationStruct *)
                                                                  params.brandingInformation)
                .logo)
            .color
            = @"exampleColor";
        ((MTRContentLauncherClusterStyleInformationStruct *) ((MTRContentLauncherClusterBrandingInformationStruct *)
                                                                  params.brandingInformation)
                .logo)
            .size
            = [[MTRContentLauncherClusterDimensionStruct alloc] init];
        ((MTRContentLauncherClusterDimensionStruct *) ((MTRContentLauncherClusterStyleInformationStruct *) ((MTRContentLauncherClusterBrandingInformationStruct *)
                                                                                                                params
                                                                                                                    .brandingInformation)
                                                           .logo)
                .size)
            .width
            = [NSNumber numberWithDouble:0];
        ((MTRContentLauncherClusterDimensionStruct *) ((MTRContentLauncherClusterStyleInformationStruct *) ((MTRContentLauncherClusterBrandingInformationStruct *)
                                                                                                                params
                                                                                                                    .brandingInformation)
                                                           .logo)
                .size)
            .height
            = [NSNumber numberWithDouble:0];
        ((MTRContentLauncherClusterDimensionStruct *) ((MTRContentLauncherClusterStyleInformationStruct *) ((MTRContentLauncherClusterBrandingInformationStruct *)
                                                                                                                params
                                                                                                                    .brandingInformation)
                                                           .logo)
                .size)
            .metric
            = [NSNumber numberWithUnsignedChar:0U];

        ((MTRContentLauncherClusterBrandingInformationStruct *) params.brandingInformation).progressBar =
            [[MTRContentLauncherClusterStyleInformationStruct alloc] init];
        ((MTRContentLauncherClusterStyleInformationStruct *) ((MTRContentLauncherClusterBrandingInformationStruct *)
                                                                  params.brandingInformation)
                .progressBar)
            .imageURL
            = @"exampleUrl";
        ((MTRContentLauncherClusterStyleInformationStruct *) ((MTRContentLauncherClusterBrandingInformationStruct *)
                                                                  params.brandingInformation)
                .progressBar)
            .color
            = @"exampleColor";
        ((MTRContentLauncherClusterStyleInformationStruct *) ((MTRContentLauncherClusterBrandingInformationStruct *)
                                                                  params.brandingInformation)
                .progressBar)
            .size
            = [[MTRContentLauncherClusterDimensionStruct alloc] init];
        ((MTRContentLauncherClusterDimensionStruct *) ((MTRContentLauncherClusterStyleInformationStruct *) ((MTRContentLauncherClusterBrandingInformationStruct *)
                                                                                                                params
                                                                                                                    .brandingInformation)
                                                           .progressBar)
                .size)
            .width
            = [NSNumber numberWithDouble:0];
        ((MTRContentLauncherClusterDimensionStruct *) ((MTRContentLauncherClusterStyleInformationStruct *) ((MTRContentLauncherClusterBrandingInformationStruct *)
                                                                                                                params
                                                                                                                    .brandingInformation)
                                                           .progressBar)
                .size)
            .height
            = [NSNumber numberWithDouble:0];
        ((MTRContentLauncherClusterDimensionStruct *) ((MTRContentLauncherClusterStyleInformationStruct *) ((MTRContentLauncherClusterBrandingInformationStruct *)
                                                                                                                params
                                                                                                                    .brandingInformation)
                                                           .progressBar)
                .size)
            .metric
            = [NSNumber numberWithUnsignedChar:0U];

        ((MTRContentLauncherClusterBrandingInformationStruct *) params.brandingInformation).splash =
            [[MTRContentLauncherClusterStyleInformationStruct alloc] init];
        ((MTRContentLauncherClusterStyleInformationStruct *) ((MTRContentLauncherClusterBrandingInformationStruct *)
                                                                  params.brandingInformation)
                .splash)
            .imageURL
            = @"exampleUrl";
        ((MTRContentLauncherClusterStyleInformationStruct *) ((MTRContentLauncherClusterBrandingInformationStruct *)
                                                                  params.brandingInformation)
                .splash)
            .color
            = @"exampleColor";
        ((MTRContentLauncherClusterStyleInformationStruct *) ((MTRContentLauncherClusterBrandingInformationStruct *)
                                                                  params.brandingInformation)
                .splash)
            .size
            = [[MTRContentLauncherClusterDimensionStruct alloc] init];
        ((MTRContentLauncherClusterDimensionStruct *) ((MTRContentLauncherClusterStyleInformationStruct *) ((MTRContentLauncherClusterBrandingInformationStruct *)
                                                                                                                params
                                                                                                                    .brandingInformation)
                                                           .splash)
                .size)
            .width
            = [NSNumber numberWithDouble:0];
        ((MTRContentLauncherClusterDimensionStruct *) ((MTRContentLauncherClusterStyleInformationStruct *) ((MTRContentLauncherClusterBrandingInformationStruct *)
                                                                                                                params
                                                                                                                    .brandingInformation)
                                                           .splash)
                .size)
            .height
            = [NSNumber numberWithDouble:0];
        ((MTRContentLauncherClusterDimensionStruct *) ((MTRContentLauncherClusterStyleInformationStruct *) ((MTRContentLauncherClusterBrandingInformationStruct *)
                                                                                                                params
                                                                                                                    .brandingInformation)
                                                           .splash)
                .size)
            .metric
            = [NSNumber numberWithUnsignedChar:0U];

        ((MTRContentLauncherClusterBrandingInformationStruct *) params.brandingInformation).waterMark =
            [[MTRContentLauncherClusterStyleInformationStruct alloc] init];
        ((MTRContentLauncherClusterStyleInformationStruct *) ((MTRContentLauncherClusterBrandingInformationStruct *)
                                                                  params.brandingInformation)
                .waterMark)
            .imageURL
            = @"exampleUrl";
        ((MTRContentLauncherClusterStyleInformationStruct *) ((MTRContentLauncherClusterBrandingInformationStruct *)
                                                                  params.brandingInformation)
                .waterMark)
            .color
            = @"exampleColor";
        ((MTRContentLauncherClusterStyleInformationStruct *) ((MTRContentLauncherClusterBrandingInformationStruct *)
                                                                  params.brandingInformation)
                .waterMark)
            .size
            = [[MTRContentLauncherClusterDimensionStruct alloc] init];
        ((MTRContentLauncherClusterDimensionStruct *) ((MTRContentLauncherClusterStyleInformationStruct *) ((MTRContentLauncherClusterBrandingInformationStruct *)
                                                                                                                params
                                                                                                                    .brandingInformation)
                                                           .waterMark)
                .size)
            .width
            = [NSNumber numberWithDouble:0];
        ((MTRContentLauncherClusterDimensionStruct *) ((MTRContentLauncherClusterStyleInformationStruct *) ((MTRContentLauncherClusterBrandingInformationStruct *)
                                                                                                                params
                                                                                                                    .brandingInformation)
                                                           .waterMark)
                .size)
            .height
            = [NSNumber numberWithDouble:0];
        ((MTRContentLauncherClusterDimensionStruct *) ((MTRContentLauncherClusterStyleInformationStruct *) ((MTRContentLauncherClusterBrandingInformationStruct *)
                                                                                                                params
                                                                                                                    .brandingInformation)
                                                           .waterMark)
                .size)
            .metric
            = [NSNumber numberWithUnsignedChar:0U];

        [cluster
            launchURLWithParams:params
                     completion:^(MTRContentLauncherClusterLauncherResponseParams * _Nullable values, NSError * _Nullable err) {
                         NSLog(@"Launch URL Command Error: %@", err);

                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                         {
                             id actualValue = values.status;
                             VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                         }

                         {
                             id actualValue = values.data;
                             VerifyOrReturn(CheckValueAsString("Data", actualValue, @"exampleData"));
                         }

                         NextTest();
                     }];

        return CHIP_NO_ERROR;
    }
};

class TV_MediaInputCluster : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TV_MediaInputCluster()
        : TestCommandBridge("TV_MediaInputCluster")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TV_MediaInputCluster() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TV_MediaInputCluster\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TV_MediaInputCluster\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read attribute media input list\n");
            err = TestReadAttributeMediaInputList_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read current media input\n");
            err = TestReadCurrentMediaInput_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Select Input Command\n");
            err = TestSelectInputCommand_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Hide Input Status Command\n");
            err = TestHideInputStatusCommand_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Show Input Status Command\n");
            err = TestShowInputStatusCommand_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Rename Input Command\n");
            err = TestRenameInputCommand_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read attribute media input list\n");
            err = TestReadAttributeMediaInputList_7();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 8;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadAttributeMediaInputList_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInputListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute media input list Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("InputList", [actualValue count], static_cast<uint32_t>(2)));
                VerifyOrReturn(CheckValue("Index", ((MTRMediaInputClusterInputInfoStruct *) actualValue[0]).index, 1U));
                VerifyOrReturn(CheckValue("InputType", ((MTRMediaInputClusterInputInfoStruct *) actualValue[0]).inputType, 4U));
                VerifyOrReturn(CheckValueAsString("Name", ((MTRMediaInputClusterInputInfoStruct *) actualValue[0]).name, @"HDMI"));
                VerifyOrReturn(
                    CheckValueAsString("Description", ((MTRMediaInputClusterInputInfoStruct *) actualValue[0]).descriptionString,
                        @"High-Definition Multimedia Interface"));
                VerifyOrReturn(CheckValue("Index", ((MTRMediaInputClusterInputInfoStruct *) actualValue[1]).index, 2U));
                VerifyOrReturn(CheckValue("InputType", ((MTRMediaInputClusterInputInfoStruct *) actualValue[1]).inputType, 4U));
                VerifyOrReturn(CheckValueAsString("Name", ((MTRMediaInputClusterInputInfoStruct *) actualValue[1]).name, @"HDMI"));
                VerifyOrReturn(
                    CheckValueAsString("Description", ((MTRMediaInputClusterInputInfoStruct *) actualValue[1]).descriptionString,
                        @"High-Definition Multimedia Interface"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadCurrentMediaInput_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentInputWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read current media input Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentInput", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSelectInputCommand_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRMediaInputClusterSelectInputParams alloc] init];
        params.index = [NSNumber numberWithUnsignedChar:1U];
        [cluster selectInputWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"Select Input Command Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestHideInputStatusCommand_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster hideInputStatusWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Hide Input Status Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestShowInputStatusCommand_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster showInputStatusWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Show Input Status Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRenameInputCommand_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRMediaInputClusterRenameInputParams alloc] init];
        params.index = [NSNumber numberWithUnsignedChar:1U];
        params.name = @"HDMI Test";
        [cluster renameInputWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"Rename Input Command Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeMediaInputList_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInputListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute media input list Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("InputList", [actualValue count], static_cast<uint32_t>(2)));
                VerifyOrReturn(CheckValue("Index", ((MTRMediaInputClusterInputInfoStruct *) actualValue[0]).index, 1U));
                VerifyOrReturn(CheckValue("InputType", ((MTRMediaInputClusterInputInfoStruct *) actualValue[0]).inputType, 4U));
                VerifyOrReturn(
                    CheckValueAsString("Name", ((MTRMediaInputClusterInputInfoStruct *) actualValue[0]).name, @"HDMI Test"));
                VerifyOrReturn(
                    CheckValueAsString("Description", ((MTRMediaInputClusterInputInfoStruct *) actualValue[0]).descriptionString,
                        @"High-Definition Multimedia Interface"));
                VerifyOrReturn(CheckValue("Index", ((MTRMediaInputClusterInputInfoStruct *) actualValue[1]).index, 2U));
                VerifyOrReturn(CheckValue("InputType", ((MTRMediaInputClusterInputInfoStruct *) actualValue[1]).inputType, 4U));
                VerifyOrReturn(CheckValueAsString("Name", ((MTRMediaInputClusterInputInfoStruct *) actualValue[1]).name, @"HDMI"));
                VerifyOrReturn(
                    CheckValueAsString("Description", ((MTRMediaInputClusterInputInfoStruct *) actualValue[1]).descriptionString,
                        @"High-Definition Multimedia Interface"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class TestCASERecovery : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestCASERecovery()
        : TestCommandBridge("TestCASERecovery")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestCASERecovery() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestCASERecovery\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestCASERecovery\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read an attribute\n");
            err = TestReadAnAttribute_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Reboot the server\n");
            err = TestRebootTheServer_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Re-get our session, but without expiring sesssions\n");
            err = TestReGetOurSessionButWithoutExpiringSesssions_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read an attribute again\n");
            err = TestReadAnAttributeAgain_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Re-get our session, but without expiring sesssions\n");
            err = TestReGetOurSessionButWithoutExpiringSesssions_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read an attribute a third time\n");
            err = TestReadAnAttributeAThirdTime_6();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), EMBER_ZCL_STATUS_FAILURE));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 7;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadAnAttribute_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBasicInformation alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeDataModelRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read an attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("DataModelRevision", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRebootTheServer_2()
    {

        chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
        return Reboot("alpha", value);
    }

    CHIP_ERROR TestReGetOurSessionButWithoutExpiringSesssions_3()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        value.expireExistingSession.Emplace();
        value.expireExistingSession.Value() = false;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadAnAttributeAgain_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBasicInformation alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeDataModelRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read an attribute again Error: %@", err);

            VerifyOrReturn(CheckValue("status",
                err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE) : 0,
                EMBER_ZCL_STATUS_FAILURE));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReGetOurSessionButWithoutExpiringSesssions_5()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        value.expireExistingSession.Emplace();
        value.expireExistingSession.Value() = false;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadAnAttributeAThirdTime_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBasicInformation alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeDataModelRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read an attribute a third time Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("DataModelRevision", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class TestCluster : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestCluster()
        : TestCommandBridge("TestCluster")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestCluster() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestCluster\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestCluster\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Send Test Command\n");
            err = TestSendTestCommand_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Send Test Not Handled Command\n");
            err = TestSendTestNotHandledCommand_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Send Test Specific Command\n");
            err = TestSendTestSpecificCommand_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Send Test Add Arguments Command\n");
            err = TestSendTestAddArgumentsCommand_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Send failing Test Add Arguments Command\n");
            err = TestSendFailingTestAddArgumentsCommand_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read attribute BOOLEAN Default Value\n");
            err = TestReadAttributeBooleanDefaultValue_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Write attribute BOOLEAN True\n");
            err = TestWriteAttributeBooleanTrue_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read attribute BOOLEAN True\n");
            err = TestReadAttributeBooleanTrue_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Write attribute BOOLEAN False\n");
            err = TestWriteAttributeBooleanFalse_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Read attribute BOOLEAN False\n");
            err = TestReadAttributeBooleanFalse_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Read attribute BITMAP8 Default Value\n");
            err = TestReadAttributeBitmap8DefaultValue_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Write attribute BITMAP8 Max Value\n");
            err = TestWriteAttributeBitmap8MaxValue_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Read attribute BITMAP8 Max Value\n");
            err = TestReadAttributeBitmap8MaxValue_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Write attribute BITMAP8 Min Value\n");
            err = TestWriteAttributeBitmap8MinValue_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Read attribute BITMAP8 Min Value\n");
            err = TestReadAttributeBitmap8MinValue_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Read attribute BITMAP16 Default Value\n");
            err = TestReadAttributeBitmap16DefaultValue_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Write attribute BITMAP16 Max Value\n");
            err = TestWriteAttributeBitmap16MaxValue_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Read attribute BITMAP16 Max Value\n");
            err = TestReadAttributeBitmap16MaxValue_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Write attribute BITMAP16 Min Value\n");
            err = TestWriteAttributeBitmap16MinValue_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Read attribute BITMAP16 Min Value\n");
            err = TestReadAttributeBitmap16MinValue_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Read attribute BITMAP32 Default Value\n");
            err = TestReadAttributeBitmap32DefaultValue_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : Write attribute BITMAP32 Max Value\n");
            err = TestWriteAttributeBitmap32MaxValue_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : Read attribute BITMAP32 Max Value\n");
            err = TestReadAttributeBitmap32MaxValue_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : Write attribute BITMAP32 Min Value\n");
            err = TestWriteAttributeBitmap32MinValue_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : Read attribute BITMAP32 Min Value\n");
            err = TestReadAttributeBitmap32MinValue_25();
            break;
        case 26:
            ChipLogProgress(chipTool, " ***** Test Step 26 : Read attribute BITMAP64 Default Value\n");
            err = TestReadAttributeBitmap64DefaultValue_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : Write attribute BITMAP64 Max Value\n");
            err = TestWriteAttributeBitmap64MaxValue_27();
            break;
        case 28:
            ChipLogProgress(chipTool, " ***** Test Step 28 : Read attribute BITMAP64 Max Value\n");
            err = TestReadAttributeBitmap64MaxValue_28();
            break;
        case 29:
            ChipLogProgress(chipTool, " ***** Test Step 29 : Write attribute BITMAP64 Min Value\n");
            err = TestWriteAttributeBitmap64MinValue_29();
            break;
        case 30:
            ChipLogProgress(chipTool, " ***** Test Step 30 : Read attribute BITMAP64 Min Value\n");
            err = TestReadAttributeBitmap64MinValue_30();
            break;
        case 31:
            ChipLogProgress(chipTool, " ***** Test Step 31 : Read attribute INT8U Default Value\n");
            err = TestReadAttributeInt8uDefaultValue_31();
            break;
        case 32:
            ChipLogProgress(chipTool, " ***** Test Step 32 : Write attribute INT8U Max Value\n");
            err = TestWriteAttributeInt8uMaxValue_32();
            break;
        case 33:
            ChipLogProgress(chipTool, " ***** Test Step 33 : Read attribute INT8U Max Value\n");
            err = TestReadAttributeInt8uMaxValue_33();
            break;
        case 34:
            ChipLogProgress(chipTool, " ***** Test Step 34 : Write attribute INT8U Min Value\n");
            err = TestWriteAttributeInt8uMinValue_34();
            break;
        case 35:
            ChipLogProgress(chipTool, " ***** Test Step 35 : Read attribute INT8U Min Value\n");
            err = TestReadAttributeInt8uMinValue_35();
            break;
        case 36:
            ChipLogProgress(chipTool, " ***** Test Step 36 : Read attribute INT16U Default Value\n");
            err = TestReadAttributeInt16uDefaultValue_36();
            break;
        case 37:
            ChipLogProgress(chipTool, " ***** Test Step 37 : Write attribute INT16U Max Value\n");
            err = TestWriteAttributeInt16uMaxValue_37();
            break;
        case 38:
            ChipLogProgress(chipTool, " ***** Test Step 38 : Read attribute INT16U Max Value\n");
            err = TestReadAttributeInt16uMaxValue_38();
            break;
        case 39:
            ChipLogProgress(chipTool, " ***** Test Step 39 : Write attribute INT16U Min Value\n");
            err = TestWriteAttributeInt16uMinValue_39();
            break;
        case 40:
            ChipLogProgress(chipTool, " ***** Test Step 40 : Read attribute INT16U Min Value\n");
            err = TestReadAttributeInt16uMinValue_40();
            break;
        case 41:
            ChipLogProgress(chipTool, " ***** Test Step 41 : Read attribute INT32U Default Value\n");
            err = TestReadAttributeInt32uDefaultValue_41();
            break;
        case 42:
            ChipLogProgress(chipTool, " ***** Test Step 42 : Write attribute INT32U Max Value\n");
            err = TestWriteAttributeInt32uMaxValue_42();
            break;
        case 43:
            ChipLogProgress(chipTool, " ***** Test Step 43 : Read attribute INT32U Max Value\n");
            err = TestReadAttributeInt32uMaxValue_43();
            break;
        case 44:
            ChipLogProgress(chipTool, " ***** Test Step 44 : Write attribute INT32U Min Value\n");
            err = TestWriteAttributeInt32uMinValue_44();
            break;
        case 45:
            ChipLogProgress(chipTool, " ***** Test Step 45 : Read attribute INT32U Min Value\n");
            err = TestReadAttributeInt32uMinValue_45();
            break;
        case 46:
            ChipLogProgress(chipTool, " ***** Test Step 46 : Read attribute INT64U Default Value\n");
            err = TestReadAttributeInt64uDefaultValue_46();
            break;
        case 47:
            ChipLogProgress(chipTool, " ***** Test Step 47 : Write attribute INT64U Max Value\n");
            err = TestWriteAttributeInt64uMaxValue_47();
            break;
        case 48:
            ChipLogProgress(chipTool, " ***** Test Step 48 : Read attribute INT64U Max Value\n");
            err = TestReadAttributeInt64uMaxValue_48();
            break;
        case 49:
            ChipLogProgress(chipTool, " ***** Test Step 49 : Write attribute INT64U Min Value\n");
            err = TestWriteAttributeInt64uMinValue_49();
            break;
        case 50:
            ChipLogProgress(chipTool, " ***** Test Step 50 : Read attribute INT64U Min Value\n");
            err = TestReadAttributeInt64uMinValue_50();
            break;
        case 51:
            ChipLogProgress(chipTool, " ***** Test Step 51 : Read attribute INT8S Default Value\n");
            err = TestReadAttributeInt8sDefaultValue_51();
            break;
        case 52:
            ChipLogProgress(chipTool, " ***** Test Step 52 : Write attribute INT8S Max Value\n");
            err = TestWriteAttributeInt8sMaxValue_52();
            break;
        case 53:
            ChipLogProgress(chipTool, " ***** Test Step 53 : Read attribute INT8S Max Value\n");
            err = TestReadAttributeInt8sMaxValue_53();
            break;
        case 54:
            ChipLogProgress(chipTool, " ***** Test Step 54 : Write attribute INT8S Min Value\n");
            err = TestWriteAttributeInt8sMinValue_54();
            break;
        case 55:
            ChipLogProgress(chipTool, " ***** Test Step 55 : Read attribute INT8S Min Value\n");
            err = TestReadAttributeInt8sMinValue_55();
            break;
        case 56:
            ChipLogProgress(chipTool, " ***** Test Step 56 : Write attribute INT8S Default Value\n");
            err = TestWriteAttributeInt8sDefaultValue_56();
            break;
        case 57:
            ChipLogProgress(chipTool, " ***** Test Step 57 : Read attribute INT8S Default Value\n");
            err = TestReadAttributeInt8sDefaultValue_57();
            break;
        case 58:
            ChipLogProgress(chipTool, " ***** Test Step 58 : Read attribute INT16S Default Value\n");
            err = TestReadAttributeInt16sDefaultValue_58();
            break;
        case 59:
            ChipLogProgress(chipTool, " ***** Test Step 59 : Write attribute INT16S Max Value\n");
            err = TestWriteAttributeInt16sMaxValue_59();
            break;
        case 60:
            ChipLogProgress(chipTool, " ***** Test Step 60 : Read attribute INT16S Max Value\n");
            err = TestReadAttributeInt16sMaxValue_60();
            break;
        case 61:
            ChipLogProgress(chipTool, " ***** Test Step 61 : Write attribute INT16S Min Value\n");
            err = TestWriteAttributeInt16sMinValue_61();
            break;
        case 62:
            ChipLogProgress(chipTool, " ***** Test Step 62 : Read attribute INT16S Min Value\n");
            err = TestReadAttributeInt16sMinValue_62();
            break;
        case 63:
            ChipLogProgress(chipTool, " ***** Test Step 63 : Write attribute INT16S Default Value\n");
            err = TestWriteAttributeInt16sDefaultValue_63();
            break;
        case 64:
            ChipLogProgress(chipTool, " ***** Test Step 64 : Read attribute INT16S Default Value\n");
            err = TestReadAttributeInt16sDefaultValue_64();
            break;
        case 65:
            ChipLogProgress(chipTool, " ***** Test Step 65 : Read attribute INT32S Default Value\n");
            err = TestReadAttributeInt32sDefaultValue_65();
            break;
        case 66:
            ChipLogProgress(chipTool, " ***** Test Step 66 : Write attribute INT32S Max Value\n");
            err = TestWriteAttributeInt32sMaxValue_66();
            break;
        case 67:
            ChipLogProgress(chipTool, " ***** Test Step 67 : Read attribute INT32S Max Value\n");
            err = TestReadAttributeInt32sMaxValue_67();
            break;
        case 68:
            ChipLogProgress(chipTool, " ***** Test Step 68 : Write attribute INT32S Min Value\n");
            err = TestWriteAttributeInt32sMinValue_68();
            break;
        case 69:
            ChipLogProgress(chipTool, " ***** Test Step 69 : Read attribute INT32S Min Value\n");
            err = TestReadAttributeInt32sMinValue_69();
            break;
        case 70:
            ChipLogProgress(chipTool, " ***** Test Step 70 : Write attribute INT32S Default Value\n");
            err = TestWriteAttributeInt32sDefaultValue_70();
            break;
        case 71:
            ChipLogProgress(chipTool, " ***** Test Step 71 : Read attribute INT32S Default Value\n");
            err = TestReadAttributeInt32sDefaultValue_71();
            break;
        case 72:
            ChipLogProgress(chipTool, " ***** Test Step 72 : Read attribute INT64S Default Value\n");
            err = TestReadAttributeInt64sDefaultValue_72();
            break;
        case 73:
            ChipLogProgress(chipTool, " ***** Test Step 73 : Write attribute INT64S Max Value\n");
            err = TestWriteAttributeInt64sMaxValue_73();
            break;
        case 74:
            ChipLogProgress(chipTool, " ***** Test Step 74 : Read attribute INT64S Max Value\n");
            err = TestReadAttributeInt64sMaxValue_74();
            break;
        case 75:
            ChipLogProgress(chipTool, " ***** Test Step 75 : Write attribute INT64S Min Value\n");
            err = TestWriteAttributeInt64sMinValue_75();
            break;
        case 76:
            ChipLogProgress(chipTool, " ***** Test Step 76 : Read attribute INT64S Min Value\n");
            err = TestReadAttributeInt64sMinValue_76();
            break;
        case 77:
            ChipLogProgress(chipTool, " ***** Test Step 77 : Write attribute INT64S Default Value\n");
            err = TestWriteAttributeInt64sDefaultValue_77();
            break;
        case 78:
            ChipLogProgress(chipTool, " ***** Test Step 78 : Read attribute INT64S Default Value\n");
            err = TestReadAttributeInt64sDefaultValue_78();
            break;
        case 79:
            ChipLogProgress(chipTool, " ***** Test Step 79 : Read attribute SINGLE Default Value\n");
            err = TestReadAttributeSingleDefaultValue_79();
            break;
        case 80:
            ChipLogProgress(chipTool, " ***** Test Step 80 : Write attribute SINGLE medium Value\n");
            err = TestWriteAttributeSingleMediumValue_80();
            break;
        case 81:
            ChipLogProgress(chipTool, " ***** Test Step 81 : Read attribute SINGLE medium Value\n");
            err = TestReadAttributeSingleMediumValue_81();
            break;
        case 82:
            ChipLogProgress(chipTool, " ***** Test Step 82 : Write attribute SINGLE large Value\n");
            err = TestWriteAttributeSingleLargeValue_82();
            break;
        case 83:
            ChipLogProgress(chipTool, " ***** Test Step 83 : Read attribute SINGLE large Value\n");
            err = TestReadAttributeSingleLargeValue_83();
            break;
        case 84:
            ChipLogProgress(chipTool, " ***** Test Step 84 : Write attribute SINGLE small Value\n");
            err = TestWriteAttributeSingleSmallValue_84();
            break;
        case 85:
            ChipLogProgress(chipTool, " ***** Test Step 85 : Read attribute SINGLE small Value\n");
            err = TestReadAttributeSingleSmallValue_85();
            break;
        case 86:
            ChipLogProgress(chipTool, " ***** Test Step 86 : Write attribute SINGLE Default Value\n");
            err = TestWriteAttributeSingleDefaultValue_86();
            break;
        case 87:
            ChipLogProgress(chipTool, " ***** Test Step 87 : Read attribute SINGLE Default Value\n");
            err = TestReadAttributeSingleDefaultValue_87();
            break;
        case 88:
            ChipLogProgress(chipTool, " ***** Test Step 88 : Read attribute DOUBLE Default Value\n");
            err = TestReadAttributeDoubleDefaultValue_88();
            break;
        case 89:
            ChipLogProgress(chipTool, " ***** Test Step 89 : Write attribute DOUBLE medium Value\n");
            err = TestWriteAttributeDoubleMediumValue_89();
            break;
        case 90:
            ChipLogProgress(chipTool, " ***** Test Step 90 : Read attribute DOUBLE medium Value\n");
            err = TestReadAttributeDoubleMediumValue_90();
            break;
        case 91:
            ChipLogProgress(chipTool, " ***** Test Step 91 : Write attribute DOUBLE large Value\n");
            err = TestWriteAttributeDoubleLargeValue_91();
            break;
        case 92:
            ChipLogProgress(chipTool, " ***** Test Step 92 : Read attribute DOUBLE large Value\n");
            err = TestReadAttributeDoubleLargeValue_92();
            break;
        case 93:
            ChipLogProgress(chipTool, " ***** Test Step 93 : Write attribute DOUBLE small Value\n");
            err = TestWriteAttributeDoubleSmallValue_93();
            break;
        case 94:
            ChipLogProgress(chipTool, " ***** Test Step 94 : Read attribute DOUBLE small Value\n");
            err = TestReadAttributeDoubleSmallValue_94();
            break;
        case 95:
            ChipLogProgress(chipTool, " ***** Test Step 95 : Write attribute DOUBLE Default Value\n");
            err = TestWriteAttributeDoubleDefaultValue_95();
            break;
        case 96:
            ChipLogProgress(chipTool, " ***** Test Step 96 : Read attribute DOUBLE Default Value\n");
            err = TestReadAttributeDoubleDefaultValue_96();
            break;
        case 97:
            ChipLogProgress(chipTool, " ***** Test Step 97 : Read attribute ENUM8 Default Value\n");
            err = TestReadAttributeEnum8DefaultValue_97();
            break;
        case 98:
            ChipLogProgress(chipTool, " ***** Test Step 98 : Write attribute ENUM8 Max Value\n");
            err = TestWriteAttributeEnum8MaxValue_98();
            break;
        case 99:
            ChipLogProgress(chipTool, " ***** Test Step 99 : Read attribute ENUM8 Max Value\n");
            err = TestReadAttributeEnum8MaxValue_99();
            break;
        case 100:
            ChipLogProgress(chipTool, " ***** Test Step 100 : Write attribute ENUM8 Min Value\n");
            err = TestWriteAttributeEnum8MinValue_100();
            break;
        case 101:
            ChipLogProgress(chipTool, " ***** Test Step 101 : Read attribute ENUM8 Min Value\n");
            err = TestReadAttributeEnum8MinValue_101();
            break;
        case 102:
            ChipLogProgress(chipTool, " ***** Test Step 102 : Read attribute ENUM16 Default Value\n");
            err = TestReadAttributeEnum16DefaultValue_102();
            break;
        case 103:
            ChipLogProgress(chipTool, " ***** Test Step 103 : Write attribute ENUM16 Max Value\n");
            err = TestWriteAttributeEnum16MaxValue_103();
            break;
        case 104:
            ChipLogProgress(chipTool, " ***** Test Step 104 : Read attribute ENUM16 Max Value\n");
            err = TestReadAttributeEnum16MaxValue_104();
            break;
        case 105:
            ChipLogProgress(chipTool, " ***** Test Step 105 : Write attribute ENUM16 Min Value\n");
            err = TestWriteAttributeEnum16MinValue_105();
            break;
        case 106:
            ChipLogProgress(chipTool, " ***** Test Step 106 : Read attribute ENUM16 Min Value\n");
            err = TestReadAttributeEnum16MinValue_106();
            break;
        case 107:
            ChipLogProgress(chipTool, " ***** Test Step 107 : Read attribute OCTET_STRING Default Value\n");
            err = TestReadAttributeOctetStringDefaultValue_107();
            break;
        case 108:
            ChipLogProgress(chipTool, " ***** Test Step 108 : Write attribute OCTET_STRING with embedded null\n");
            err = TestWriteAttributeOctetStringWithEmbeddedNull_108();
            break;
        case 109:
            ChipLogProgress(chipTool, " ***** Test Step 109 : Read attribute OCTET_STRING with embedded null\n");
            err = TestReadAttributeOctetStringWithEmbeddedNull_109();
            break;
        case 110:
            ChipLogProgress(chipTool, " ***** Test Step 110 : Write attribute OCTET_STRING with hex: format\n");
            err = TestWriteAttributeOctetStringWithHexFormat_110();
            break;
        case 111:
            ChipLogProgress(chipTool, " ***** Test Step 111 : Read attribute OCTET_STRING with hex: format\n");
            err = TestReadAttributeOctetStringWithHexFormat_111();
            break;
        case 112:
            ChipLogProgress(chipTool, " ***** Test Step 112 : Write attribute OCTET_STRING with weird chars\n");
            err = TestWriteAttributeOctetStringWithWeirdChars_112();
            break;
        case 113:
            ChipLogProgress(chipTool, " ***** Test Step 113 : Read attribute OCTET_STRING with weird chars\n");
            err = TestReadAttributeOctetStringWithWeirdChars_113();
            break;
        case 114:
            ChipLogProgress(chipTool, " ***** Test Step 114 : Write attribute OCTET_STRING\n");
            err = TestWriteAttributeOctetString_114();
            break;
        case 115:
            ChipLogProgress(chipTool, " ***** Test Step 115 : Read attribute OCTET_STRING\n");
            err = TestReadAttributeOctetString_115();
            break;
        case 116:
            ChipLogProgress(chipTool, " ***** Test Step 116 : Write attribute OCTET_STRING\n");
            err = TestWriteAttributeOctetString_116();
            break;
        case 117:
            ChipLogProgress(chipTool, " ***** Test Step 117 : Read attribute OCTET_STRING\n");
            err = TestReadAttributeOctetString_117();
            break;
        case 118:
            ChipLogProgress(chipTool, " ***** Test Step 118 : Write attribute OCTET_STRING\n");
            err = TestWriteAttributeOctetString_118();
            break;
        case 119:
            ChipLogProgress(chipTool, " ***** Test Step 119 : Read attribute LONG_OCTET_STRING Default Value\n");
            err = TestReadAttributeLongOctetStringDefaultValue_119();
            break;
        case 120:
            ChipLogProgress(chipTool, " ***** Test Step 120 : Write attribute LONG_OCTET_STRING\n");
            err = TestWriteAttributeLongOctetString_120();
            break;
        case 121:
            ChipLogProgress(chipTool, " ***** Test Step 121 : Read attribute LONG_OCTET_STRING\n");
            err = TestReadAttributeLongOctetString_121();
            break;
        case 122:
            ChipLogProgress(chipTool, " ***** Test Step 122 : Write attribute LONG_OCTET_STRING\n");
            err = TestWriteAttributeLongOctetString_122();
            break;
        case 123:
            ChipLogProgress(chipTool, " ***** Test Step 123 : Read attribute CHAR_STRING Default Value\n");
            err = TestReadAttributeCharStringDefaultValue_123();
            break;
        case 124:
            ChipLogProgress(chipTool, " ***** Test Step 124 : Write attribute CHAR_STRING\n");
            err = TestWriteAttributeCharString_124();
            break;
        case 125:
            ChipLogProgress(chipTool, " ***** Test Step 125 : Read attribute CHAR_STRING\n");
            err = TestReadAttributeCharString_125();
            break;
        case 126:
            ChipLogProgress(chipTool, " ***** Test Step 126 : Write attribute CHAR_STRING - Value too long\n");
            err = TestWriteAttributeCharStringValueTooLong_126();
            break;
        case 127:
            ChipLogProgress(chipTool, " ***** Test Step 127 : Read attribute CHAR_STRING\n");
            err = TestReadAttributeCharString_127();
            break;
        case 128:
            ChipLogProgress(chipTool, " ***** Test Step 128 : Write attribute CHAR_STRING - Empty\n");
            err = TestWriteAttributeCharStringEmpty_128();
            break;
        case 129:
            ChipLogProgress(chipTool, " ***** Test Step 129 : Read attribute LONG_CHAR_STRING Default Value\n");
            err = TestReadAttributeLongCharStringDefaultValue_129();
            break;
        case 130:
            ChipLogProgress(chipTool, " ***** Test Step 130 : Write attribute LONG_CHAR_STRING\n");
            err = TestWriteAttributeLongCharString_130();
            break;
        case 131:
            ChipLogProgress(chipTool, " ***** Test Step 131 : Read attribute LONG_CHAR_STRING\n");
            err = TestReadAttributeLongCharString_131();
            break;
        case 132:
            ChipLogProgress(chipTool, " ***** Test Step 132 : Write attribute LONG_CHAR_STRING\n");
            err = TestWriteAttributeLongCharString_132();
            break;
        case 133:
            ChipLogProgress(chipTool, " ***** Test Step 133 : Read attribute LIST_LONG_OCTET_STRING (for chunked read)\n");
            err = TestReadAttributeListLongOctetStringForChunkedRead_133();
            break;
        case 134:
            ChipLogProgress(chipTool, " ***** Test Step 134 : Write attribute LIST_LONG_OCTET_STRING (for chunked write)\n");
            err = TestWriteAttributeListLongOctetStringForChunkedWrite_134();
            break;
        case 135:
            ChipLogProgress(chipTool, " ***** Test Step 135 : Read attribute LIST_LONG_OCTET_STRING (for chunked read)\n");
            err = TestReadAttributeListLongOctetStringForChunkedRead_135();
            break;
        case 136:
            ChipLogProgress(chipTool, " ***** Test Step 136 : Write attribute LIST_LONG_OCTET_STRING (for chunked write)\n");
            err = TestWriteAttributeListLongOctetStringForChunkedWrite_136();
            break;
        case 137:
            ChipLogProgress(chipTool, " ***** Test Step 137 : Read attribute EPOCH_US Default Value\n");
            err = TestReadAttributeEpochUsDefaultValue_137();
            break;
        case 138:
            ChipLogProgress(chipTool, " ***** Test Step 138 : Write attribute EPOCH_US Max Value\n");
            err = TestWriteAttributeEpochUsMaxValue_138();
            break;
        case 139:
            ChipLogProgress(chipTool, " ***** Test Step 139 : Read attribute EPOCH_US Max Value\n");
            err = TestReadAttributeEpochUsMaxValue_139();
            break;
        case 140:
            ChipLogProgress(chipTool, " ***** Test Step 140 : Write attribute EPOCH_US Min Value\n");
            err = TestWriteAttributeEpochUsMinValue_140();
            break;
        case 141:
            ChipLogProgress(chipTool, " ***** Test Step 141 : Read attribute EPOCH_US Min Value\n");
            err = TestReadAttributeEpochUsMinValue_141();
            break;
        case 142:
            ChipLogProgress(chipTool, " ***** Test Step 142 : Read attribute EPOCH_S Default Value\n");
            err = TestReadAttributeEpochSDefaultValue_142();
            break;
        case 143:
            ChipLogProgress(chipTool, " ***** Test Step 143 : Write attribute EPOCH_S Max Value\n");
            err = TestWriteAttributeEpochSMaxValue_143();
            break;
        case 144:
            ChipLogProgress(chipTool, " ***** Test Step 144 : Read attribute EPOCH_S Max Value\n");
            err = TestReadAttributeEpochSMaxValue_144();
            break;
        case 145:
            ChipLogProgress(chipTool, " ***** Test Step 145 : Write attribute EPOCH_S Min Value\n");
            err = TestWriteAttributeEpochSMinValue_145();
            break;
        case 146:
            ChipLogProgress(chipTool, " ***** Test Step 146 : Read attribute EPOCH_S Min Value\n");
            err = TestReadAttributeEpochSMinValue_146();
            break;
        case 147:
            ChipLogProgress(chipTool, " ***** Test Step 147 : Read attribute UNSUPPORTED\n");
            err = TestReadAttributeUnsupported_147();
            break;
        case 148:
            ChipLogProgress(chipTool, " ***** Test Step 148 : Writeattribute UNSUPPORTED\n");
            err = TestWriteattributeUnsupported_148();
            break;
        case 149:
            ChipLogProgress(chipTool, " ***** Test Step 149 : Send Test Command to unsupported endpoint\n");
            err = TestSendTestCommandToUnsupportedEndpoint_149();
            break;
        case 150:
            ChipLogProgress(chipTool, " ***** Test Step 150 : Send Test Command to unsupported cluster\n");
            err = TestSendTestCommandToUnsupportedCluster_150();
            break;
        case 151:
            ChipLogProgress(chipTool, " ***** Test Step 151 : Read attribute vendor_id Default Value\n");
            err = TestReadAttributeVendorIdDefaultValue_151();
            break;
        case 152:
            ChipLogProgress(chipTool, " ***** Test Step 152 : Write attribute vendor_id\n");
            err = TestWriteAttributeVendorId_152();
            break;
        case 153:
            ChipLogProgress(chipTool, " ***** Test Step 153 : Read attribute vendor_id\n");
            err = TestReadAttributeVendorId_153();
            break;
        case 154:
            ChipLogProgress(chipTool, " ***** Test Step 154 : Restore attribute vendor_id\n");
            err = TestRestoreAttributeVendorId_154();
            break;
        case 155:
            ChipLogProgress(chipTool, " ***** Test Step 155 : Send a command with a vendor_id and enum\n");
            err = TestSendACommandWithAVendorIdAndEnum_155();
            break;
        case 156:
            ChipLogProgress(chipTool, " ***** Test Step 156 : Send a command with a vendor_id and invalid enum\n");
            err = TestSendACommandWithAVendorIdAndInvalidEnum_156();
            break;
        case 157:
            ChipLogProgress(chipTool, " ***** Test Step 157 : Send Test Command With Struct Argument and arg1.b is true\n");
            err = TestSendTestCommandWithStructArgumentAndArg1bIsTrue_157();
            break;
        case 158:
            ChipLogProgress(chipTool, " ***** Test Step 158 : Send Test Command With Struct Argument and arg1.b is false\n");
            err = TestSendTestCommandWithStructArgumentAndArg1bIsFalse_158();
            break;
        case 159:
            ChipLogProgress(
                chipTool, " ***** Test Step 159 : Send Test Command With Nested Struct Argument and arg1.c.b is true\n");
            err = TestSendTestCommandWithNestedStructArgumentAndArg1cbIsTrue_159();
            break;
        case 160:
            ChipLogProgress(chipTool, " ***** Test Step 160 : Send Test Command With Nested Struct Argument arg1.c.b is false\n");
            err = TestSendTestCommandWithNestedStructArgumentArg1cbIsFalse_160();
            break;
        case 161:
            ChipLogProgress(chipTool,
                " ***** Test Step 161 : Send Test Command With Nested Struct List Argument and all fields b of arg1.d are true\n");
            err = TestSendTestCommandWithNestedStructListArgumentAndAllFieldsBOfArg1dAreTrue_161();
            break;
        case 162:
            ChipLogProgress(chipTool,
                " ***** Test Step 162 : Send Test Command With Nested Struct List Argument and some fields b of arg1.d are "
                "false\n");
            err = TestSendTestCommandWithNestedStructListArgumentAndSomeFieldsBOfArg1dAreFalse_162();
            break;
        case 163:
            ChipLogProgress(chipTool, " ***** Test Step 163 : Send Test Command With Struct Argument and see what we get back\n");
            err = TestSendTestCommandWithStructArgumentAndSeeWhatWeGetBack_163();
            break;
        case 164:
            ChipLogProgress(chipTool, " ***** Test Step 164 : Send Test Command With List of INT8U and none of them is set to 0\n");
            err = TestSendTestCommandWithListOfInt8uAndNoneOfThemIsSetTo0_164();
            break;
        case 165:
            ChipLogProgress(chipTool, " ***** Test Step 165 : Send Test Command With List of INT8U and one of them is set to 0\n");
            err = TestSendTestCommandWithListOfInt8uAndOneOfThemIsSetTo0_165();
            break;
        case 166:
            ChipLogProgress(chipTool, " ***** Test Step 166 : Send Test Command With List of INT8U and get it reversed\n");
            err = TestSendTestCommandWithListOfInt8uAndGetItReversed_166();
            break;
        case 167:
            ChipLogProgress(
                chipTool, " ***** Test Step 167 : Send Test Command With empty List of INT8U and get an empty list back\n");
            err = TestSendTestCommandWithEmptyListOfInt8uAndGetAnEmptyListBack_167();
            break;
        case 168:
            ChipLogProgress(chipTool,
                " ***** Test Step 168 : Send Test Command With List of Struct Argument and arg1.b of first item is true\n");
            err = TestSendTestCommandWithListOfStructArgumentAndArg1bOfFirstItemIsTrue_168();
            break;
        case 169:
            ChipLogProgress(chipTool,
                " ***** Test Step 169 : Send Test Command With List of Struct Argument and arg1.b of first item is false\n");
            err = TestSendTestCommandWithListOfStructArgumentAndArg1bOfFirstItemIsFalse_169();
            break;
        case 170:
            ChipLogProgress(chipTool,
                " ***** Test Step 170 : Send Test Command With List of Nested Struct List Argument and all fields b of elements of "
                "arg1.d are true\n");
            err = TestSendTestCommandWithListOfNestedStructListArgumentAndAllFieldsBOfElementsOfArg1dAreTrue_170();
            break;
        case 171:
            ChipLogProgress(chipTool,
                " ***** Test Step 171 : Send Test Command With Nested Struct List Argument and some fields b of elements of arg1.d "
                "are false\n");
            err = TestSendTestCommandWithNestedStructListArgumentAndSomeFieldsBOfElementsOfArg1dAreFalse_171();
            break;
        case 172:
            ChipLogProgress(
                chipTool, " ***** Test Step 172 : Write attribute LIST With List of INT8U and none of them is set to 0\n");
            err = TestWriteAttributeListWithListOfInt8uAndNoneOfThemIsSetTo0_172();
            break;
        case 173:
            ChipLogProgress(chipTool, " ***** Test Step 173 : Read attribute LIST With List of INT8U\n");
            err = TestReadAttributeListWithListOfInt8u_173();
            break;
        case 174:
            ChipLogProgress(chipTool, " ***** Test Step 174 : Write attribute LIST With List of OCTET_STRING\n");
            err = TestWriteAttributeListWithListOfOctetString_174();
            break;
        case 175:
            ChipLogProgress(chipTool, " ***** Test Step 175 : Read attribute LIST With List of OCTET_STRING\n");
            err = TestReadAttributeListWithListOfOctetString_175();
            break;
        case 176:
            ChipLogProgress(chipTool, " ***** Test Step 176 : Write attribute LIST With List of LIST_STRUCT_OCTET_STRING\n");
            err = TestWriteAttributeListWithListOfListStructOctetString_176();
            break;
        case 177:
            ChipLogProgress(chipTool, " ***** Test Step 177 : Read attribute LIST With List of LIST_STRUCT_OCTET_STRING\n");
            err = TestReadAttributeListWithListOfListStructOctetString_177();
            break;
        case 178:
            ChipLogProgress(chipTool, " ***** Test Step 178 : Send Test Command with optional arg set.\n");
            err = TestSendTestCommandWithOptionalArgSet_178();
            break;
        case 179:
            ChipLogProgress(chipTool, " ***** Test Step 179 : Send Test Command without its optional arg.\n");
            err = TestSendTestCommandWithoutItsOptionalArg_179();
            break;
        case 180:
            ChipLogProgress(chipTool, " ***** Test Step 180 : Read list of structs containing nullables and optionals\n");
            err = TestReadListOfStructsContainingNullablesAndOptionals_180();
            break;
        case 181:
            ChipLogProgress(chipTool, " ***** Test Step 181 : Write list of structs containing nullables and optionals\n");
            err = TestWriteListOfStructsContainingNullablesAndOptionals_181();
            break;
        case 182:
            ChipLogProgress(
                chipTool, " ***** Test Step 182 : Read list of structs containing nullables and optionals after writing\n");
            err = TestReadListOfStructsContainingNullablesAndOptionalsAfterWriting_182();
            break;
        case 183:
            ChipLogProgress(chipTool, " ***** Test Step 183 : Write attribute NULLABLE_BOOLEAN null\n");
            err = TestWriteAttributeNullableBooleanNull_183();
            break;
        case 184:
            ChipLogProgress(chipTool, " ***** Test Step 184 : Read attribute NULLABLE_BOOLEAN null\n");
            err = TestReadAttributeNullableBooleanNull_184();
            break;
        case 185:
            ChipLogProgress(chipTool, " ***** Test Step 185 : Write attribute NULLABLE_BOOLEAN True\n");
            err = TestWriteAttributeNullableBooleanTrue_185();
            break;
        case 186:
            ChipLogProgress(chipTool, " ***** Test Step 186 : Read attribute NULLABLE_BOOLEAN True\n");
            err = TestReadAttributeNullableBooleanTrue_186();
            break;
        case 187:
            ChipLogProgress(chipTool, " ***** Test Step 187 : Read attribute NULLABLE_BOOLEAN not null\n");
            err = TestReadAttributeNullableBooleanNotNull_187();
            break;
        case 188:
            ChipLogProgress(chipTool, " ***** Test Step 188 : Write attribute NULLABLE_BITMAP8 Max Value\n");
            err = TestWriteAttributeNullableBitmap8MaxValue_188();
            break;
        case 189:
            ChipLogProgress(chipTool, " ***** Test Step 189 : Read attribute NULLABLE_BITMAP8 Max Value\n");
            err = TestReadAttributeNullableBitmap8MaxValue_189();
            break;
        case 190:
            ChipLogProgress(chipTool, " ***** Test Step 190 : Write attribute NULLABLE_BITMAP8 Invalid Value\n");
            err = TestWriteAttributeNullableBitmap8InvalidValue_190();
            break;
        case 191:
            ChipLogProgress(chipTool, " ***** Test Step 191 : Read attribute NULLABLE_BITMAP8 unchanged Value\n");
            err = TestReadAttributeNullableBitmap8UnchangedValue_191();
            break;
        case 192:
            ChipLogProgress(chipTool, " ***** Test Step 192 : Write attribute NULLABLE_BITMAP8 null Value\n");
            err = TestWriteAttributeNullableBitmap8NullValue_192();
            break;
        case 193:
            ChipLogProgress(chipTool, " ***** Test Step 193 : Read attribute NULLABLE_BITMAP8 null Value\n");
            err = TestReadAttributeNullableBitmap8NullValue_193();
            break;
        case 194:
            ChipLogProgress(chipTool, " ***** Test Step 194 : Read attribute NULLABLE_BITMAP8 not 254 Value\n");
            err = TestReadAttributeNullableBitmap8Not254Value_194();
            break;
        case 195:
            ChipLogProgress(chipTool, " ***** Test Step 195 : Write attribute NULLABLE_BITMAP16 Max Value\n");
            err = TestWriteAttributeNullableBitmap16MaxValue_195();
            break;
        case 196:
            ChipLogProgress(chipTool, " ***** Test Step 196 : Read attribute NULLABLE_BITMAP16 Max Value\n");
            err = TestReadAttributeNullableBitmap16MaxValue_196();
            break;
        case 197:
            ChipLogProgress(chipTool, " ***** Test Step 197 : Write attribute NULLABLE_BITMAP16 Invalid Value\n");
            err = TestWriteAttributeNullableBitmap16InvalidValue_197();
            break;
        case 198:
            ChipLogProgress(chipTool, " ***** Test Step 198 : Read attribute NULLABLE_BITMAP16 unchanged Value\n");
            err = TestReadAttributeNullableBitmap16UnchangedValue_198();
            break;
        case 199:
            ChipLogProgress(chipTool, " ***** Test Step 199 : Write attribute NULLABLE_BITMAP16 null Value\n");
            err = TestWriteAttributeNullableBitmap16NullValue_199();
            break;
        case 200:
            ChipLogProgress(chipTool, " ***** Test Step 200 : Read attribute NULLABLE_BITMAP16 null Value\n");
            err = TestReadAttributeNullableBitmap16NullValue_200();
            break;
        case 201:
            ChipLogProgress(chipTool, " ***** Test Step 201 : Write attribute NULLABLE_BITMAP32 Max Value\n");
            err = TestWriteAttributeNullableBitmap32MaxValue_201();
            break;
        case 202:
            ChipLogProgress(chipTool, " ***** Test Step 202 : Read attribute NULLABLE_BITMAP32 Max Value\n");
            err = TestReadAttributeNullableBitmap32MaxValue_202();
            break;
        case 203:
            ChipLogProgress(chipTool, " ***** Test Step 203 : Write attribute NULLABLE_BITMAP32 Invalid Value\n");
            err = TestWriteAttributeNullableBitmap32InvalidValue_203();
            break;
        case 204:
            ChipLogProgress(chipTool, " ***** Test Step 204 : Read attribute NULLABLE_BITMAP32 unchanged Value\n");
            err = TestReadAttributeNullableBitmap32UnchangedValue_204();
            break;
        case 205:
            ChipLogProgress(chipTool, " ***** Test Step 205 : Write attribute NULLABLE_BITMAP32 null Value\n");
            err = TestWriteAttributeNullableBitmap32NullValue_205();
            break;
        case 206:
            ChipLogProgress(chipTool, " ***** Test Step 206 : Read attribute NULLABLE_BITMAP32 null Value\n");
            err = TestReadAttributeNullableBitmap32NullValue_206();
            break;
        case 207:
            ChipLogProgress(chipTool, " ***** Test Step 207 : Write attribute NULLABLE_BITMAP64 Max Value\n");
            err = TestWriteAttributeNullableBitmap64MaxValue_207();
            break;
        case 208:
            ChipLogProgress(chipTool, " ***** Test Step 208 : Read attribute NULLABLE_BITMAP64 Max Value\n");
            err = TestReadAttributeNullableBitmap64MaxValue_208();
            break;
        case 209:
            ChipLogProgress(chipTool, " ***** Test Step 209 : Write attribute NULLABLE_BITMAP64 Invalid Value\n");
            err = TestWriteAttributeNullableBitmap64InvalidValue_209();
            break;
        case 210:
            ChipLogProgress(chipTool, " ***** Test Step 210 : Read attribute NULLABLE_BITMAP64 unchanged Value\n");
            err = TestReadAttributeNullableBitmap64UnchangedValue_210();
            break;
        case 211:
            ChipLogProgress(chipTool, " ***** Test Step 211 : Write attribute NULLABLE_BITMAP64 null Value\n");
            err = TestWriteAttributeNullableBitmap64NullValue_211();
            break;
        case 212:
            ChipLogProgress(chipTool, " ***** Test Step 212 : Read attribute NULLABLE_BITMAP64 null Value\n");
            err = TestReadAttributeNullableBitmap64NullValue_212();
            break;
        case 213:
            ChipLogProgress(chipTool, " ***** Test Step 213 : Write attribute NULLABLE_INT8U Min Value\n");
            err = TestWriteAttributeNullableInt8uMinValue_213();
            break;
        case 214:
            ChipLogProgress(chipTool, " ***** Test Step 214 : Read attribute NULLABLE_INT8U Min Value\n");
            err = TestReadAttributeNullableInt8uMinValue_214();
            break;
        case 215:
            ChipLogProgress(chipTool, " ***** Test Step 215 : Write attribute NULLABLE_INT8U Max Value\n");
            err = TestWriteAttributeNullableInt8uMaxValue_215();
            break;
        case 216:
            ChipLogProgress(chipTool, " ***** Test Step 216 : Read attribute NULLABLE_INT8U Max Value\n");
            err = TestReadAttributeNullableInt8uMaxValue_216();
            break;
        case 217:
            ChipLogProgress(chipTool, " ***** Test Step 217 : Write attribute NULLABLE_INT8U Invalid Value\n");
            err = TestWriteAttributeNullableInt8uInvalidValue_217();
            break;
        case 218:
            ChipLogProgress(chipTool, " ***** Test Step 218 : Read attribute NULLABLE_INT8U unchanged Value\n");
            err = TestReadAttributeNullableInt8uUnchangedValue_218();
            break;
        case 219:
            ChipLogProgress(chipTool, " ***** Test Step 219 : Read attribute NULLABLE_INT8U unchanged Value with constraint\n");
            err = TestReadAttributeNullableInt8uUnchangedValueWithConstraint_219();
            break;
        case 220:
            ChipLogProgress(chipTool, " ***** Test Step 220 : Write attribute NULLABLE_INT8U null Value\n");
            err = TestWriteAttributeNullableInt8uNullValue_220();
            break;
        case 221:
            ChipLogProgress(chipTool, " ***** Test Step 221 : Read attribute NULLABLE_INT8U null Value\n");
            err = TestReadAttributeNullableInt8uNullValue_221();
            break;
        case 222:
            ChipLogProgress(chipTool, " ***** Test Step 222 : Read attribute NULLABLE_INT8U null Value & range\n");
            err = TestReadAttributeNullableInt8uNullValueRange_222();
            break;
        case 223:
            ChipLogProgress(chipTool, " ***** Test Step 223 : Read attribute NULLABLE_INT8U null Value & not\n");
            err = TestReadAttributeNullableInt8uNullValueNot_223();
            break;
        case 224:
            ChipLogProgress(chipTool, " ***** Test Step 224 : Write attribute NULLABLE_INT8U Value\n");
            err = TestWriteAttributeNullableInt8uValue_224();
            break;
        case 225:
            ChipLogProgress(chipTool, " ***** Test Step 225 : Read attribute NULLABLE_INT8U Value in range\n");
            err = TestReadAttributeNullableInt8uValueInRange_225();
            break;
        case 226:
            ChipLogProgress(chipTool, " ***** Test Step 226 : Read attribute NULLABLE_INT8U notValue OK\n");
            err = TestReadAttributeNullableInt8uNotValueOk_226();
            break;
        case 227:
            ChipLogProgress(chipTool, " ***** Test Step 227 : Write attribute NULLABLE_INT16U Min Value\n");
            err = TestWriteAttributeNullableInt16uMinValue_227();
            break;
        case 228:
            ChipLogProgress(chipTool, " ***** Test Step 228 : Read attribute NULLABLE_INT16U Min Value\n");
            err = TestReadAttributeNullableInt16uMinValue_228();
            break;
        case 229:
            ChipLogProgress(chipTool, " ***** Test Step 229 : Write attribute NULLABLE_INT16U Max Value\n");
            err = TestWriteAttributeNullableInt16uMaxValue_229();
            break;
        case 230:
            ChipLogProgress(chipTool, " ***** Test Step 230 : Read attribute NULLABLE_INT16U Max Value\n");
            err = TestReadAttributeNullableInt16uMaxValue_230();
            break;
        case 231:
            ChipLogProgress(chipTool, " ***** Test Step 231 : Write attribute NULLABLE_INT16U Invalid Value\n");
            err = TestWriteAttributeNullableInt16uInvalidValue_231();
            break;
        case 232:
            ChipLogProgress(chipTool, " ***** Test Step 232 : Read attribute NULLABLE_INT16U unchanged Value\n");
            err = TestReadAttributeNullableInt16uUnchangedValue_232();
            break;
        case 233:
            ChipLogProgress(chipTool, " ***** Test Step 233 : Write attribute NULLABLE_INT16U null Value\n");
            err = TestWriteAttributeNullableInt16uNullValue_233();
            break;
        case 234:
            ChipLogProgress(chipTool, " ***** Test Step 234 : Read attribute NULLABLE_INT16U null Value\n");
            err = TestReadAttributeNullableInt16uNullValue_234();
            break;
        case 235:
            ChipLogProgress(chipTool, " ***** Test Step 235 : Read attribute NULLABLE_INT16U null Value & range\n");
            err = TestReadAttributeNullableInt16uNullValueRange_235();
            break;
        case 236:
            ChipLogProgress(chipTool, " ***** Test Step 236 : Read attribute NULLABLE_INT16U null Value & not\n");
            err = TestReadAttributeNullableInt16uNullValueNot_236();
            break;
        case 237:
            ChipLogProgress(chipTool, " ***** Test Step 237 : Write attribute NULLABLE_INT16U Value\n");
            err = TestWriteAttributeNullableInt16uValue_237();
            break;
        case 238:
            ChipLogProgress(chipTool, " ***** Test Step 238 : Read attribute NULLABLE_INT16U Value in range\n");
            err = TestReadAttributeNullableInt16uValueInRange_238();
            break;
        case 239:
            ChipLogProgress(chipTool, " ***** Test Step 239 : Read attribute NULLABLE_INT16U notValue OK\n");
            err = TestReadAttributeNullableInt16uNotValueOk_239();
            break;
        case 240:
            ChipLogProgress(chipTool, " ***** Test Step 240 : Write attribute NULLABLE_INT32U Min Value\n");
            err = TestWriteAttributeNullableInt32uMinValue_240();
            break;
        case 241:
            ChipLogProgress(chipTool, " ***** Test Step 241 : Read attribute NULLABLE_INT32U Min Value\n");
            err = TestReadAttributeNullableInt32uMinValue_241();
            break;
        case 242:
            ChipLogProgress(chipTool, " ***** Test Step 242 : Write attribute NULLABLE_INT32U Max Value\n");
            err = TestWriteAttributeNullableInt32uMaxValue_242();
            break;
        case 243:
            ChipLogProgress(chipTool, " ***** Test Step 243 : Read attribute NULLABLE_INT32U Max Value\n");
            err = TestReadAttributeNullableInt32uMaxValue_243();
            break;
        case 244:
            ChipLogProgress(chipTool, " ***** Test Step 244 : Write attribute NULLABLE_INT32U Invalid Value\n");
            err = TestWriteAttributeNullableInt32uInvalidValue_244();
            break;
        case 245:
            ChipLogProgress(chipTool, " ***** Test Step 245 : Read attribute NULLABLE_INT32U unchanged Value\n");
            err = TestReadAttributeNullableInt32uUnchangedValue_245();
            break;
        case 246:
            ChipLogProgress(chipTool, " ***** Test Step 246 : Write attribute NULLABLE_INT32U null Value\n");
            err = TestWriteAttributeNullableInt32uNullValue_246();
            break;
        case 247:
            ChipLogProgress(chipTool, " ***** Test Step 247 : Read attribute NULLABLE_INT32U null Value\n");
            err = TestReadAttributeNullableInt32uNullValue_247();
            break;
        case 248:
            ChipLogProgress(chipTool, " ***** Test Step 248 : Read attribute NULLABLE_INT32U null Value & range\n");
            err = TestReadAttributeNullableInt32uNullValueRange_248();
            break;
        case 249:
            ChipLogProgress(chipTool, " ***** Test Step 249 : Read attribute NULLABLE_INT32U null Value & not\n");
            err = TestReadAttributeNullableInt32uNullValueNot_249();
            break;
        case 250:
            ChipLogProgress(chipTool, " ***** Test Step 250 : Write attribute NULLABLE_INT32U Value\n");
            err = TestWriteAttributeNullableInt32uValue_250();
            break;
        case 251:
            ChipLogProgress(chipTool, " ***** Test Step 251 : Read attribute NULLABLE_INT32U Value in range\n");
            err = TestReadAttributeNullableInt32uValueInRange_251();
            break;
        case 252:
            ChipLogProgress(chipTool, " ***** Test Step 252 : Read attribute NULLABLE_INT32U notValue OK\n");
            err = TestReadAttributeNullableInt32uNotValueOk_252();
            break;
        case 253:
            ChipLogProgress(chipTool, " ***** Test Step 253 : Write attribute NULLABLE_INT64U Min Value\n");
            err = TestWriteAttributeNullableInt64uMinValue_253();
            break;
        case 254:
            ChipLogProgress(chipTool, " ***** Test Step 254 : Read attribute NULLABLE_INT64U Min Value\n");
            err = TestReadAttributeNullableInt64uMinValue_254();
            break;
        case 255:
            ChipLogProgress(chipTool, " ***** Test Step 255 : Write attribute NULLABLE_INT64U Max Value\n");
            err = TestWriteAttributeNullableInt64uMaxValue_255();
            break;
        case 256:
            ChipLogProgress(chipTool, " ***** Test Step 256 : Read attribute NULLABLE_INT64U Max Value\n");
            err = TestReadAttributeNullableInt64uMaxValue_256();
            break;
        case 257:
            ChipLogProgress(chipTool, " ***** Test Step 257 : Write attribute NULLABLE_INT64U Invalid Value\n");
            err = TestWriteAttributeNullableInt64uInvalidValue_257();
            break;
        case 258:
            ChipLogProgress(chipTool, " ***** Test Step 258 : Read attribute NULLABLE_INT64U unchanged Value\n");
            err = TestReadAttributeNullableInt64uUnchangedValue_258();
            break;
        case 259:
            ChipLogProgress(chipTool, " ***** Test Step 259 : Write attribute NULLABLE_INT64U null Value\n");
            err = TestWriteAttributeNullableInt64uNullValue_259();
            break;
        case 260:
            ChipLogProgress(chipTool, " ***** Test Step 260 : Read attribute NULLABLE_INT64U null Value\n");
            err = TestReadAttributeNullableInt64uNullValue_260();
            break;
        case 261:
            ChipLogProgress(chipTool, " ***** Test Step 261 : Read attribute NULLABLE_INT64U null Value & range\n");
            err = TestReadAttributeNullableInt64uNullValueRange_261();
            break;
        case 262:
            ChipLogProgress(chipTool, " ***** Test Step 262 : Read attribute NULLABLE_INT64U null Value & not\n");
            err = TestReadAttributeNullableInt64uNullValueNot_262();
            break;
        case 263:
            ChipLogProgress(chipTool, " ***** Test Step 263 : Write attribute NULLABLE_INT64U Value\n");
            err = TestWriteAttributeNullableInt64uValue_263();
            break;
        case 264:
            ChipLogProgress(chipTool, " ***** Test Step 264 : Read attribute NULLABLE_INT64U Value in range\n");
            err = TestReadAttributeNullableInt64uValueInRange_264();
            break;
        case 265:
            ChipLogProgress(chipTool, " ***** Test Step 265 : Read attribute NULLABLE_INT64U notValue OK\n");
            err = TestReadAttributeNullableInt64uNotValueOk_265();
            break;
        case 266:
            ChipLogProgress(chipTool, " ***** Test Step 266 : Write attribute NULLABLE_INT8S Min Value\n");
            err = TestWriteAttributeNullableInt8sMinValue_266();
            break;
        case 267:
            ChipLogProgress(chipTool, " ***** Test Step 267 : Read attribute NULLABLE_INT8S Min Value\n");
            err = TestReadAttributeNullableInt8sMinValue_267();
            break;
        case 268:
            ChipLogProgress(chipTool, " ***** Test Step 268 : Write attribute NULLABLE_INT8S Invalid Value\n");
            err = TestWriteAttributeNullableInt8sInvalidValue_268();
            break;
        case 269:
            ChipLogProgress(chipTool, " ***** Test Step 269 : Read attribute NULLABLE_INT8S unchanged Value\n");
            err = TestReadAttributeNullableInt8sUnchangedValue_269();
            break;
        case 270:
            ChipLogProgress(chipTool, " ***** Test Step 270 : Write attribute NULLABLE_INT8S null Value\n");
            err = TestWriteAttributeNullableInt8sNullValue_270();
            break;
        case 271:
            ChipLogProgress(chipTool, " ***** Test Step 271 : Read attribute NULLABLE_INT8S null Value\n");
            err = TestReadAttributeNullableInt8sNullValue_271();
            break;
        case 272:
            ChipLogProgress(chipTool, " ***** Test Step 272 : Read attribute NULLABLE_INT8S null Value & range\n");
            err = TestReadAttributeNullableInt8sNullValueRange_272();
            break;
        case 273:
            ChipLogProgress(chipTool, " ***** Test Step 273 : Read attribute NULLABLE_INT8S null Value & not\n");
            err = TestReadAttributeNullableInt8sNullValueNot_273();
            break;
        case 274:
            ChipLogProgress(chipTool, " ***** Test Step 274 : Write attribute NULLABLE_INT8S Value\n");
            err = TestWriteAttributeNullableInt8sValue_274();
            break;
        case 275:
            ChipLogProgress(chipTool, " ***** Test Step 275 : Read attribute NULLABLE_INT8S Value in range\n");
            err = TestReadAttributeNullableInt8sValueInRange_275();
            break;
        case 276:
            ChipLogProgress(chipTool, " ***** Test Step 276 : Read attribute NULLABLE_INT8S notValue OK\n");
            err = TestReadAttributeNullableInt8sNotValueOk_276();
            break;
        case 277:
            ChipLogProgress(chipTool, " ***** Test Step 277 : Write attribute NULLABLE_INT16S Min Value\n");
            err = TestWriteAttributeNullableInt16sMinValue_277();
            break;
        case 278:
            ChipLogProgress(chipTool, " ***** Test Step 278 : Read attribute NULLABLE_INT16S Min Value\n");
            err = TestReadAttributeNullableInt16sMinValue_278();
            break;
        case 279:
            ChipLogProgress(chipTool, " ***** Test Step 279 : Write attribute NULLABLE_INT16S Invalid Value\n");
            err = TestWriteAttributeNullableInt16sInvalidValue_279();
            break;
        case 280:
            ChipLogProgress(chipTool, " ***** Test Step 280 : Read attribute NULLABLE_INT16S unchanged Value\n");
            err = TestReadAttributeNullableInt16sUnchangedValue_280();
            break;
        case 281:
            ChipLogProgress(chipTool, " ***** Test Step 281 : Write attribute NULLABLE_INT16S null Value\n");
            err = TestWriteAttributeNullableInt16sNullValue_281();
            break;
        case 282:
            ChipLogProgress(chipTool, " ***** Test Step 282 : Read attribute NULLABLE_INT16S null Value\n");
            err = TestReadAttributeNullableInt16sNullValue_282();
            break;
        case 283:
            ChipLogProgress(chipTool, " ***** Test Step 283 : Read attribute NULLABLE_INT16S null Value & range\n");
            err = TestReadAttributeNullableInt16sNullValueRange_283();
            break;
        case 284:
            ChipLogProgress(chipTool, " ***** Test Step 284 : Read attribute NULLABLE_INT16S null Value & not\n");
            err = TestReadAttributeNullableInt16sNullValueNot_284();
            break;
        case 285:
            ChipLogProgress(chipTool, " ***** Test Step 285 : Write attribute NULLABLE_INT16S Value\n");
            err = TestWriteAttributeNullableInt16sValue_285();
            break;
        case 286:
            ChipLogProgress(chipTool, " ***** Test Step 286 : Read attribute NULLABLE_INT16S Value in range\n");
            err = TestReadAttributeNullableInt16sValueInRange_286();
            break;
        case 287:
            ChipLogProgress(chipTool, " ***** Test Step 287 : Read attribute NULLABLE_INT16S notValue OK\n");
            err = TestReadAttributeNullableInt16sNotValueOk_287();
            break;
        case 288:
            ChipLogProgress(chipTool, " ***** Test Step 288 : Write attribute NULLABLE_INT32S Min Value\n");
            err = TestWriteAttributeNullableInt32sMinValue_288();
            break;
        case 289:
            ChipLogProgress(chipTool, " ***** Test Step 289 : Read attribute NULLABLE_INT32S Min Value\n");
            err = TestReadAttributeNullableInt32sMinValue_289();
            break;
        case 290:
            ChipLogProgress(chipTool, " ***** Test Step 290 : Write attribute NULLABLE_INT32S Invalid Value\n");
            err = TestWriteAttributeNullableInt32sInvalidValue_290();
            break;
        case 291:
            ChipLogProgress(chipTool, " ***** Test Step 291 : Read attribute NULLABLE_INT32S unchanged Value\n");
            err = TestReadAttributeNullableInt32sUnchangedValue_291();
            break;
        case 292:
            ChipLogProgress(chipTool, " ***** Test Step 292 : Write attribute NULLABLE_INT32S null Value\n");
            err = TestWriteAttributeNullableInt32sNullValue_292();
            break;
        case 293:
            ChipLogProgress(chipTool, " ***** Test Step 293 : Read attribute NULLABLE_INT32S null Value\n");
            err = TestReadAttributeNullableInt32sNullValue_293();
            break;
        case 294:
            ChipLogProgress(chipTool, " ***** Test Step 294 : Read attribute NULLABLE_INT32S null Value & range\n");
            err = TestReadAttributeNullableInt32sNullValueRange_294();
            break;
        case 295:
            ChipLogProgress(chipTool, " ***** Test Step 295 : Read attribute NULLABLE_INT32S null Value & not\n");
            err = TestReadAttributeNullableInt32sNullValueNot_295();
            break;
        case 296:
            ChipLogProgress(chipTool, " ***** Test Step 296 : Write attribute NULLABLE_INT32S Value\n");
            err = TestWriteAttributeNullableInt32sValue_296();
            break;
        case 297:
            ChipLogProgress(chipTool, " ***** Test Step 297 : Read attribute NULLABLE_INT32S Value in range\n");
            err = TestReadAttributeNullableInt32sValueInRange_297();
            break;
        case 298:
            ChipLogProgress(chipTool, " ***** Test Step 298 : Read attribute NULLABLE_INT32S notValue OK\n");
            err = TestReadAttributeNullableInt32sNotValueOk_298();
            break;
        case 299:
            ChipLogProgress(chipTool, " ***** Test Step 299 : Write attribute NULLABLE_INT64S Min Value\n");
            err = TestWriteAttributeNullableInt64sMinValue_299();
            break;
        case 300:
            ChipLogProgress(chipTool, " ***** Test Step 300 : Read attribute NULLABLE_INT64S Min Value\n");
            err = TestReadAttributeNullableInt64sMinValue_300();
            break;
        case 301:
            ChipLogProgress(chipTool, " ***** Test Step 301 : Write attribute NULLABLE_INT64S Invalid Value\n");
            err = TestWriteAttributeNullableInt64sInvalidValue_301();
            break;
        case 302:
            ChipLogProgress(chipTool, " ***** Test Step 302 : Read attribute NULLABLE_INT64S unchanged Value\n");
            err = TestReadAttributeNullableInt64sUnchangedValue_302();
            break;
        case 303:
            ChipLogProgress(chipTool, " ***** Test Step 303 : Write attribute NULLABLE_INT64S null Value\n");
            err = TestWriteAttributeNullableInt64sNullValue_303();
            break;
        case 304:
            ChipLogProgress(chipTool, " ***** Test Step 304 : Read attribute NULLABLE_INT64S null Value\n");
            err = TestReadAttributeNullableInt64sNullValue_304();
            break;
        case 305:
            ChipLogProgress(chipTool, " ***** Test Step 305 : Read attribute NULLABLE_INT64S null Value & range\n");
            err = TestReadAttributeNullableInt64sNullValueRange_305();
            break;
        case 306:
            ChipLogProgress(chipTool, " ***** Test Step 306 : Read attribute NULLABLE_INT64S null Value & not\n");
            err = TestReadAttributeNullableInt64sNullValueNot_306();
            break;
        case 307:
            ChipLogProgress(chipTool, " ***** Test Step 307 : Write attribute NULLABLE_INT64S Value\n");
            err = TestWriteAttributeNullableInt64sValue_307();
            break;
        case 308:
            ChipLogProgress(chipTool, " ***** Test Step 308 : Read attribute NULLABLE_INT64S Value in range\n");
            err = TestReadAttributeNullableInt64sValueInRange_308();
            break;
        case 309:
            ChipLogProgress(chipTool, " ***** Test Step 309 : Read attribute NULLABLE_INT64S notValue OK\n");
            err = TestReadAttributeNullableInt64sNotValueOk_309();
            break;
        case 310:
            ChipLogProgress(chipTool, " ***** Test Step 310 : Write attribute NULLABLE_SINGLE medium Value\n");
            err = TestWriteAttributeNullableSingleMediumValue_310();
            break;
        case 311:
            ChipLogProgress(chipTool, " ***** Test Step 311 : Read attribute NULLABLE_SINGLE medium Value\n");
            err = TestReadAttributeNullableSingleMediumValue_311();
            break;
        case 312:
            ChipLogProgress(chipTool, " ***** Test Step 312 : Write attribute NULLABLE_SINGLE largest Value\n");
            err = TestWriteAttributeNullableSingleLargestValue_312();
            break;
        case 313:
            ChipLogProgress(chipTool, " ***** Test Step 313 : Read attribute NULLABLE_SINGLE largest Value\n");
            err = TestReadAttributeNullableSingleLargestValue_313();
            break;
        case 314:
            ChipLogProgress(chipTool, " ***** Test Step 314 : Write attribute NULLABLE_SINGLE smallest Value\n");
            err = TestWriteAttributeNullableSingleSmallestValue_314();
            break;
        case 315:
            ChipLogProgress(chipTool, " ***** Test Step 315 : Read attribute NULLABLE_SINGLE smallest Value\n");
            err = TestReadAttributeNullableSingleSmallestValue_315();
            break;
        case 316:
            ChipLogProgress(chipTool, " ***** Test Step 316 : Write attribute NULLABLE_SINGLE null Value\n");
            err = TestWriteAttributeNullableSingleNullValue_316();
            break;
        case 317:
            ChipLogProgress(chipTool, " ***** Test Step 317 : Read attribute NULLABLE_SINGLE null Value\n");
            err = TestReadAttributeNullableSingleNullValue_317();
            break;
        case 318:
            ChipLogProgress(chipTool, " ***** Test Step 318 : Write attribute NULLABLE_SINGLE 0 Value\n");
            err = TestWriteAttributeNullableSingle0Value_318();
            break;
        case 319:
            ChipLogProgress(chipTool, " ***** Test Step 319 : Read attribute NULLABLE_SINGLE 0 Value\n");
            err = TestReadAttributeNullableSingle0Value_319();
            break;
        case 320:
            ChipLogProgress(chipTool, " ***** Test Step 320 : Write attribute NULLABLE_DOUBLE medium Value\n");
            err = TestWriteAttributeNullableDoubleMediumValue_320();
            break;
        case 321:
            ChipLogProgress(chipTool, " ***** Test Step 321 : Read attribute NULLABLE_DOUBLE medium Value\n");
            err = TestReadAttributeNullableDoubleMediumValue_321();
            break;
        case 322:
            ChipLogProgress(chipTool, " ***** Test Step 322 : Write attribute NULLABLE_DOUBLE largest Value\n");
            err = TestWriteAttributeNullableDoubleLargestValue_322();
            break;
        case 323:
            ChipLogProgress(chipTool, " ***** Test Step 323 : Read attribute NULLABLE_DOUBLE largest Value\n");
            err = TestReadAttributeNullableDoubleLargestValue_323();
            break;
        case 324:
            ChipLogProgress(chipTool, " ***** Test Step 324 : Write attribute NULLABLE_DOUBLE smallest Value\n");
            err = TestWriteAttributeNullableDoubleSmallestValue_324();
            break;
        case 325:
            ChipLogProgress(chipTool, " ***** Test Step 325 : Read attribute NULLABLE_DOUBLE smallest Value\n");
            err = TestReadAttributeNullableDoubleSmallestValue_325();
            break;
        case 326:
            ChipLogProgress(chipTool, " ***** Test Step 326 : Write attribute NULLABLE_DOUBLE null Value\n");
            err = TestWriteAttributeNullableDoubleNullValue_326();
            break;
        case 327:
            ChipLogProgress(chipTool, " ***** Test Step 327 : Read attribute NULLABLE_DOUBLE null Value\n");
            err = TestReadAttributeNullableDoubleNullValue_327();
            break;
        case 328:
            ChipLogProgress(chipTool, " ***** Test Step 328 : Write attribute NULLABLE_DOUBLE 0 Value\n");
            err = TestWriteAttributeNullableDouble0Value_328();
            break;
        case 329:
            ChipLogProgress(chipTool, " ***** Test Step 329 : Read attribute NULLABLE_DOUBLE 0 Value\n");
            err = TestReadAttributeNullableDouble0Value_329();
            break;
        case 330:
            ChipLogProgress(chipTool, " ***** Test Step 330 : Write attribute NULLABLE_ENUM8 Min Value\n");
            err = TestWriteAttributeNullableEnum8MinValue_330();
            break;
        case 331:
            ChipLogProgress(chipTool, " ***** Test Step 331 : Read attribute NULLABLE_ENUM8 Min Value\n");
            err = TestReadAttributeNullableEnum8MinValue_331();
            break;
        case 332:
            ChipLogProgress(chipTool, " ***** Test Step 332 : Write attribute NULLABLE_ENUM8 Max Value\n");
            err = TestWriteAttributeNullableEnum8MaxValue_332();
            break;
        case 333:
            ChipLogProgress(chipTool, " ***** Test Step 333 : Read attribute NULLABLE_ENUM8 Max Value\n");
            err = TestReadAttributeNullableEnum8MaxValue_333();
            break;
        case 334:
            ChipLogProgress(chipTool, " ***** Test Step 334 : Write attribute NULLABLE_ENUM8 Invalid Value\n");
            err = TestWriteAttributeNullableEnum8InvalidValue_334();
            break;
        case 335:
            ChipLogProgress(chipTool, " ***** Test Step 335 : Read attribute NULLABLE_ENUM8 unchanged Value\n");
            err = TestReadAttributeNullableEnum8UnchangedValue_335();
            break;
        case 336:
            ChipLogProgress(chipTool, " ***** Test Step 336 : Write attribute NULLABLE_ENUM8 null Value\n");
            err = TestWriteAttributeNullableEnum8NullValue_336();
            break;
        case 337:
            ChipLogProgress(chipTool, " ***** Test Step 337 : Read attribute NULLABLE_ENUM8 null Value\n");
            err = TestReadAttributeNullableEnum8NullValue_337();
            break;
        case 338:
            ChipLogProgress(chipTool, " ***** Test Step 338 : Write attribute NULLABLE_ENUM16 Min Value\n");
            err = TestWriteAttributeNullableEnum16MinValue_338();
            break;
        case 339:
            ChipLogProgress(chipTool, " ***** Test Step 339 : Read attribute NULLABLE_ENUM16 Min Value\n");
            err = TestReadAttributeNullableEnum16MinValue_339();
            break;
        case 340:
            ChipLogProgress(chipTool, " ***** Test Step 340 : Write attribute NULLABLE_ENUM16 Max Value\n");
            err = TestWriteAttributeNullableEnum16MaxValue_340();
            break;
        case 341:
            ChipLogProgress(chipTool, " ***** Test Step 341 : Read attribute NULLABLE_ENUM16 Max Value\n");
            err = TestReadAttributeNullableEnum16MaxValue_341();
            break;
        case 342:
            ChipLogProgress(chipTool, " ***** Test Step 342 : Write attribute NULLABLE_ENUM16 Invalid Value\n");
            err = TestWriteAttributeNullableEnum16InvalidValue_342();
            break;
        case 343:
            ChipLogProgress(chipTool, " ***** Test Step 343 : Read attribute NULLABLE_ENUM16 unchanged Value\n");
            err = TestReadAttributeNullableEnum16UnchangedValue_343();
            break;
        case 344:
            ChipLogProgress(chipTool, " ***** Test Step 344 : Write attribute NULLABLE_ENUM16 null Value\n");
            err = TestWriteAttributeNullableEnum16NullValue_344();
            break;
        case 345:
            ChipLogProgress(chipTool, " ***** Test Step 345 : Read attribute NULLABLE_ENUM16 null Value\n");
            err = TestReadAttributeNullableEnum16NullValue_345();
            break;
        case 346:
            ChipLogProgress(chipTool, " ***** Test Step 346 : Write attribute NULLABLE_SIMPLE_ENUM Min Value\n");
            err = TestWriteAttributeNullableSimpleEnumMinValue_346();
            break;
        case 347:
            ChipLogProgress(chipTool, " ***** Test Step 347 : Read attribute NULLABLE_SIMPLE_ENUM Min Value\n");
            err = TestReadAttributeNullableSimpleEnumMinValue_347();
            break;
        case 348:
            ChipLogProgress(chipTool, " ***** Test Step 348 : Write attribute NULLABLE_SIMPLE_ENUM Max Value\n");
            err = TestWriteAttributeNullableSimpleEnumMaxValue_348();
            break;
        case 349:
            ChipLogProgress(chipTool, " ***** Test Step 349 : Read attribute NULLABLE_SIMPLE_ENUM Max Value\n");
            err = TestReadAttributeNullableSimpleEnumMaxValue_349();
            break;
        case 350:
            ChipLogProgress(chipTool, " ***** Test Step 350 : Write attribute NULLABLE_SIMPLE_ENUM Invalid Value\n");
            err = TestWriteAttributeNullableSimpleEnumInvalidValue_350();
            break;
        case 351:
            ChipLogProgress(chipTool, " ***** Test Step 351 : Read attribute NULLABLE_SIMPLE_ENUM unchanged Value\n");
            err = TestReadAttributeNullableSimpleEnumUnchangedValue_351();
            break;
        case 352:
            ChipLogProgress(chipTool, " ***** Test Step 352 : Write attribute NULLABLE_SIMPLE_ENUM null Value\n");
            err = TestWriteAttributeNullableSimpleEnumNullValue_352();
            break;
        case 353:
            ChipLogProgress(chipTool, " ***** Test Step 353 : Read attribute NULLABLE_SIMPLE_ENUM null Value\n");
            err = TestReadAttributeNullableSimpleEnumNullValue_353();
            break;
        case 354:
            ChipLogProgress(chipTool, " ***** Test Step 354 : Read attribute NULLABLE_SIMPLE_ENUM not 3 Value\n");
            err = TestReadAttributeNullableSimpleEnumNot3Value_354();
            break;
        case 355:
            ChipLogProgress(chipTool, " ***** Test Step 355 : Read attribute NULLABLE_OCTET_STRING Default Value\n");
            err = TestReadAttributeNullableOctetStringDefaultValue_355();
            break;
        case 356:
            ChipLogProgress(chipTool, " ***** Test Step 356 : Write attribute NULLABLE_OCTET_STRING\n");
            err = TestWriteAttributeNullableOctetString_356();
            break;
        case 357:
            ChipLogProgress(chipTool, " ***** Test Step 357 : Read attribute NULLABLE_OCTET_STRING\n");
            err = TestReadAttributeNullableOctetString_357();
            break;
        case 358:
            ChipLogProgress(chipTool, " ***** Test Step 358 : Write attribute NULLABLE_OCTET_STRING\n");
            err = TestWriteAttributeNullableOctetString_358();
            break;
        case 359:
            ChipLogProgress(chipTool, " ***** Test Step 359 : Read attribute NULLABLE_OCTET_STRING\n");
            err = TestReadAttributeNullableOctetString_359();
            break;
        case 360:
            ChipLogProgress(chipTool, " ***** Test Step 360 : Write attribute NULLABLE_OCTET_STRING\n");
            err = TestWriteAttributeNullableOctetString_360();
            break;
        case 361:
            ChipLogProgress(chipTool, " ***** Test Step 361 : Read attribute NULLABLE_OCTET_STRING\n");
            err = TestReadAttributeNullableOctetString_361();
            break;
        case 362:
            ChipLogProgress(chipTool, " ***** Test Step 362 : Read attribute NULLABLE_OCTET_STRING not TestValue\n");
            err = TestReadAttributeNullableOctetStringNotTestValue_362();
            break;
        case 363:
            ChipLogProgress(chipTool, " ***** Test Step 363 : Read attribute NULLABLE_CHAR_STRING Default Value\n");
            err = TestReadAttributeNullableCharStringDefaultValue_363();
            break;
        case 364:
            ChipLogProgress(chipTool, " ***** Test Step 364 : Write attribute NULLABLE_CHAR_STRING\n");
            err = TestWriteAttributeNullableCharString_364();
            break;
        case 365:
            ChipLogProgress(chipTool, " ***** Test Step 365 : Read attribute NULLABLE_CHAR_STRING\n");
            err = TestReadAttributeNullableCharString_365();
            break;
        case 366:
            ChipLogProgress(chipTool, " ***** Test Step 366 : Read attribute NULLABLE_CHAR_STRING\n");
            err = TestReadAttributeNullableCharString_366();
            break;
        case 367:
            ChipLogProgress(chipTool, " ***** Test Step 367 : Write attribute NULLABLE_CHAR_STRING - Value too long\n");
            err = TestWriteAttributeNullableCharStringValueTooLong_367();
            break;
        case 368:
            ChipLogProgress(chipTool, " ***** Test Step 368 : Read attribute NULLABLE_CHAR_STRING\n");
            err = TestReadAttributeNullableCharString_368();
            break;
        case 369:
            ChipLogProgress(chipTool, " ***** Test Step 369 : Write attribute NULLABLE_CHAR_STRING - Empty\n");
            err = TestWriteAttributeNullableCharStringEmpty_369();
            break;
        case 370:
            ChipLogProgress(chipTool, " ***** Test Step 370 : Read attribute NULLABLE_CHAR_STRING\n");
            err = TestReadAttributeNullableCharString_370();
            break;
        case 371:
            ChipLogProgress(chipTool, " ***** Test Step 371 : Read attribute NULLABLE_CHAR_STRING not ☉T☉\n");
            err = TestReadAttributeNullableCharStringNott_371();
            break;
        case 372:
            ChipLogProgress(chipTool, " ***** Test Step 372 : Read attribute from nonexistent endpoint.\n");
            err = TestReadAttributeFromNonexistentEndpoint_372();
            break;
        case 373:
            ChipLogProgress(chipTool, " ***** Test Step 373 : Read attribute from nonexistent cluster.\n");
            err = TestReadAttributeFromNonexistentCluster_373();
            break;
        case 374:
            ChipLogProgress(
                chipTool, " ***** Test Step 374 : Send a command that takes an optional parameter but do not set it.\n");
            err = TestSendACommandThatTakesAnOptionalParameterButDoNotSetIt_374();
            break;
        case 375:
            ChipLogProgress(
                chipTool, " ***** Test Step 375 : Send a command that takes an optional parameter but do not set it.\n");
            err = TestSendACommandThatTakesAnOptionalParameterButDoNotSetIt_375();
            break;
        case 376:
            ChipLogProgress(chipTool, " ***** Test Step 376 : Report: Subscribe to list attribute\n");
            err = TestReportSubscribeToListAttribute_376();
            break;
        case 377:
            ChipLogProgress(chipTool, " ***** Test Step 377 : Subscribe to list attribute\n");
            err = TestSubscribeToListAttribute_377();
            break;
        case 378:
            ChipLogProgress(chipTool, " ***** Test Step 378 : Write subscribed-to list attribute\n");
            err = TestWriteSubscribedToListAttribute_378();
            break;
        case 379:
            ChipLogProgress(chipTool, " ***** Test Step 379 : Check for list attribute report\n");
            err = TestCheckForListAttributeReport_379();
            break;
        case 380:
            ChipLogProgress(chipTool, " ***** Test Step 380 : Read range-restricted unsigned 8-bit integer\n");
            err = TestReadRangeRestrictedUnsigned8BitInteger_380();
            break;
        case 381:
            ChipLogProgress(chipTool, " ***** Test Step 381 : Write min value to a range-restricted unsigned 8-bit integer\n");
            err = TestWriteMinValueToARangeRestrictedUnsigned8BitInteger_381();
            break;
        case 382:
            ChipLogProgress(
                chipTool, " ***** Test Step 382 : Write just-below-range value to a range-restricted unsigned 8-bit integer\n");
            err = TestWriteJustBelowRangeValueToARangeRestrictedUnsigned8BitInteger_382();
            break;
        case 383:
            ChipLogProgress(
                chipTool, " ***** Test Step 383 : Write just-above-range value to a range-restricted unsigned 8-bit integer\n");
            err = TestWriteJustAboveRangeValueToARangeRestrictedUnsigned8BitInteger_383();
            break;
        case 384:
            ChipLogProgress(chipTool, " ***** Test Step 384 : Write max value to a range-restricted unsigned 8-bit integer\n");
            err = TestWriteMaxValueToARangeRestrictedUnsigned8BitInteger_384();
            break;
        case 385:
            ChipLogProgress(
                chipTool, " ***** Test Step 385 : Verify range-restricted unsigned 8-bit integer value has not changed\n");
            err = TestVerifyRangeRestrictedUnsigned8BitIntegerValueHasNotChanged_385();
            break;
        case 386:
            ChipLogProgress(
                chipTool, " ***** Test Step 386 : Write min valid value to a range-restricted unsigned 8-bit integer\n");
            err = TestWriteMinValidValueToARangeRestrictedUnsigned8BitInteger_386();
            break;
        case 387:
            ChipLogProgress(
                chipTool, " ***** Test Step 387 : Verify range-restricted unsigned 8-bit integer value is at min valid\n");
            err = TestVerifyRangeRestrictedUnsigned8BitIntegerValueIsAtMinValid_387();
            break;
        case 388:
            ChipLogProgress(
                chipTool, " ***** Test Step 388 : Write max valid value to a range-restricted unsigned 8-bit integer\n");
            err = TestWriteMaxValidValueToARangeRestrictedUnsigned8BitInteger_388();
            break;
        case 389:
            ChipLogProgress(
                chipTool, " ***** Test Step 389 : Verify range-restricted unsigned 8-bit integer value is at max valid\n");
            err = TestVerifyRangeRestrictedUnsigned8BitIntegerValueIsAtMaxValid_389();
            break;
        case 390:
            ChipLogProgress(
                chipTool, " ***** Test Step 390 : Write middle valid value to a range-restricted unsigned 8-bit integer\n");
            err = TestWriteMiddleValidValueToARangeRestrictedUnsigned8BitInteger_390();
            break;
        case 391:
            ChipLogProgress(
                chipTool, " ***** Test Step 391 : Verify range-restricted unsigned 8-bit integer value is at mid valid\n");
            err = TestVerifyRangeRestrictedUnsigned8BitIntegerValueIsAtMidValid_391();
            break;
        case 392:
            ChipLogProgress(chipTool, " ***** Test Step 392 : Read range-restricted unsigned 16-bit integer\n");
            err = TestReadRangeRestrictedUnsigned16BitInteger_392();
            break;
        case 393:
            ChipLogProgress(chipTool, " ***** Test Step 393 : Write min value to a range-restricted unsigned 16-bit integer\n");
            err = TestWriteMinValueToARangeRestrictedUnsigned16BitInteger_393();
            break;
        case 394:
            ChipLogProgress(
                chipTool, " ***** Test Step 394 : Write just-below-range value to a range-restricted unsigned 16-bit integer\n");
            err = TestWriteJustBelowRangeValueToARangeRestrictedUnsigned16BitInteger_394();
            break;
        case 395:
            ChipLogProgress(
                chipTool, " ***** Test Step 395 : Write just-above-range value to a range-restricted unsigned 16-bit integer\n");
            err = TestWriteJustAboveRangeValueToARangeRestrictedUnsigned16BitInteger_395();
            break;
        case 396:
            ChipLogProgress(chipTool, " ***** Test Step 396 : Write max value to a range-restricted unsigned 16-bit integer\n");
            err = TestWriteMaxValueToARangeRestrictedUnsigned16BitInteger_396();
            break;
        case 397:
            ChipLogProgress(
                chipTool, " ***** Test Step 397 : Verify range-restricted unsigned 16-bit integer value has not changed\n");
            err = TestVerifyRangeRestrictedUnsigned16BitIntegerValueHasNotChanged_397();
            break;
        case 398:
            ChipLogProgress(
                chipTool, " ***** Test Step 398 : Write min valid value to a range-restricted unsigned 16-bit integer\n");
            err = TestWriteMinValidValueToARangeRestrictedUnsigned16BitInteger_398();
            break;
        case 399:
            ChipLogProgress(
                chipTool, " ***** Test Step 399 : Verify range-restricted unsigned 16-bit integer value is at min valid\n");
            err = TestVerifyRangeRestrictedUnsigned16BitIntegerValueIsAtMinValid_399();
            break;
        case 400:
            ChipLogProgress(
                chipTool, " ***** Test Step 400 : Write max valid value to a range-restricted unsigned 16-bit integer\n");
            err = TestWriteMaxValidValueToARangeRestrictedUnsigned16BitInteger_400();
            break;
        case 401:
            ChipLogProgress(
                chipTool, " ***** Test Step 401 : Verify range-restricted unsigned 16-bit integer value is at max valid\n");
            err = TestVerifyRangeRestrictedUnsigned16BitIntegerValueIsAtMaxValid_401();
            break;
        case 402:
            ChipLogProgress(
                chipTool, " ***** Test Step 402 : Write middle valid value to a range-restricted unsigned 16-bit integer\n");
            err = TestWriteMiddleValidValueToARangeRestrictedUnsigned16BitInteger_402();
            break;
        case 403:
            ChipLogProgress(
                chipTool, " ***** Test Step 403 : Verify range-restricted unsigned 16-bit integer value is at mid valid\n");
            err = TestVerifyRangeRestrictedUnsigned16BitIntegerValueIsAtMidValid_403();
            break;
        case 404:
            ChipLogProgress(chipTool, " ***** Test Step 404 : Read range-restricted signed 8-bit integer\n");
            err = TestReadRangeRestrictedSigned8BitInteger_404();
            break;
        case 405:
            ChipLogProgress(chipTool, " ***** Test Step 405 : Write min value to a range-restricted signed 8-bit integer\n");
            err = TestWriteMinValueToARangeRestrictedSigned8BitInteger_405();
            break;
        case 406:
            ChipLogProgress(
                chipTool, " ***** Test Step 406 : Write just-below-range value to a range-restricted signed 8-bit integer\n");
            err = TestWriteJustBelowRangeValueToARangeRestrictedSigned8BitInteger_406();
            break;
        case 407:
            ChipLogProgress(
                chipTool, " ***** Test Step 407 : Write just-above-range value to a range-restricted signed 8-bit integer\n");
            err = TestWriteJustAboveRangeValueToARangeRestrictedSigned8BitInteger_407();
            break;
        case 408:
            ChipLogProgress(chipTool, " ***** Test Step 408 : Write max value to a range-restricted signed 8-bit integer\n");
            err = TestWriteMaxValueToARangeRestrictedSigned8BitInteger_408();
            break;
        case 409:
            ChipLogProgress(
                chipTool, " ***** Test Step 409 : Verify range-restricted signed 8-bit integer value has not changed\n");
            err = TestVerifyRangeRestrictedSigned8BitIntegerValueHasNotChanged_409();
            break;
        case 410:
            ChipLogProgress(chipTool, " ***** Test Step 410 : Write min valid value to a range-restricted signed 8-bit integer\n");
            err = TestWriteMinValidValueToARangeRestrictedSigned8BitInteger_410();
            break;
        case 411:
            ChipLogProgress(
                chipTool, " ***** Test Step 411 : Verify range-restricted signed 8-bit integer value is at min valid\n");
            err = TestVerifyRangeRestrictedSigned8BitIntegerValueIsAtMinValid_411();
            break;
        case 412:
            ChipLogProgress(chipTool, " ***** Test Step 412 : Write max valid value to a range-restricted signed 8-bit integer\n");
            err = TestWriteMaxValidValueToARangeRestrictedSigned8BitInteger_412();
            break;
        case 413:
            ChipLogProgress(
                chipTool, " ***** Test Step 413 : Verify range-restricted signed 8-bit integer value is at max valid\n");
            err = TestVerifyRangeRestrictedSigned8BitIntegerValueIsAtMaxValid_413();
            break;
        case 414:
            ChipLogProgress(
                chipTool, " ***** Test Step 414 : Write middle valid value to a range-restricted signed 8-bit integer\n");
            err = TestWriteMiddleValidValueToARangeRestrictedSigned8BitInteger_414();
            break;
        case 415:
            ChipLogProgress(
                chipTool, " ***** Test Step 415 : Verify range-restricted signed 8-bit integer value is at mid valid\n");
            err = TestVerifyRangeRestrictedSigned8BitIntegerValueIsAtMidValid_415();
            break;
        case 416:
            ChipLogProgress(chipTool, " ***** Test Step 416 : Read range-restricted signed 16-bit integer\n");
            err = TestReadRangeRestrictedSigned16BitInteger_416();
            break;
        case 417:
            ChipLogProgress(chipTool, " ***** Test Step 417 : Write min value to a range-restricted signed 16-bit integer\n");
            err = TestWriteMinValueToARangeRestrictedSigned16BitInteger_417();
            break;
        case 418:
            ChipLogProgress(
                chipTool, " ***** Test Step 418 : Write just-below-range value to a range-restricted signed 16-bit integer\n");
            err = TestWriteJustBelowRangeValueToARangeRestrictedSigned16BitInteger_418();
            break;
        case 419:
            ChipLogProgress(
                chipTool, " ***** Test Step 419 : Write just-above-range value to a range-restricted signed 16-bit integer\n");
            err = TestWriteJustAboveRangeValueToARangeRestrictedSigned16BitInteger_419();
            break;
        case 420:
            ChipLogProgress(chipTool, " ***** Test Step 420 : Write max value to a range-restricted signed 16-bit integer\n");
            err = TestWriteMaxValueToARangeRestrictedSigned16BitInteger_420();
            break;
        case 421:
            ChipLogProgress(
                chipTool, " ***** Test Step 421 : Verify range-restricted signed 16-bit integer value has not changed\n");
            err = TestVerifyRangeRestrictedSigned16BitIntegerValueHasNotChanged_421();
            break;
        case 422:
            ChipLogProgress(chipTool, " ***** Test Step 422 : Write min valid value to a range-restricted signed 16-bit integer\n");
            err = TestWriteMinValidValueToARangeRestrictedSigned16BitInteger_422();
            break;
        case 423:
            ChipLogProgress(
                chipTool, " ***** Test Step 423 : Verify range-restricted signed 16-bit integer value is at min valid\n");
            err = TestVerifyRangeRestrictedSigned16BitIntegerValueIsAtMinValid_423();
            break;
        case 424:
            ChipLogProgress(chipTool, " ***** Test Step 424 : Write max valid value to a range-restricted signed 16-bit integer\n");
            err = TestWriteMaxValidValueToARangeRestrictedSigned16BitInteger_424();
            break;
        case 425:
            ChipLogProgress(
                chipTool, " ***** Test Step 425 : Verify range-restricted signed 16-bit integer value is at max valid\n");
            err = TestVerifyRangeRestrictedSigned16BitIntegerValueIsAtMaxValid_425();
            break;
        case 426:
            ChipLogProgress(
                chipTool, " ***** Test Step 426 : Write middle valid value to a range-restricted signed 16-bit integer\n");
            err = TestWriteMiddleValidValueToARangeRestrictedSigned16BitInteger_426();
            break;
        case 427:
            ChipLogProgress(
                chipTool, " ***** Test Step 427 : Verify range-restricted signed 16-bit integer value is at mid valid\n");
            err = TestVerifyRangeRestrictedSigned16BitIntegerValueIsAtMidValid_427();
            break;
        case 428:
            ChipLogProgress(chipTool, " ***** Test Step 428 : Read nullable range-restricted unsigned 8-bit integer\n");
            err = TestReadNullableRangeRestrictedUnsigned8BitInteger_428();
            break;
        case 429:
            ChipLogProgress(
                chipTool, " ***** Test Step 429 : Write min value to a nullable range-restricted unsigned 8-bit integer\n");
            err = TestWriteMinValueToANullableRangeRestrictedUnsigned8BitInteger_429();
            break;
        case 430:
            ChipLogProgress(chipTool,
                " ***** Test Step 430 : Write just-below-range value to a nullable range-restricted unsigned 8-bit integer\n");
            err = TestWriteJustBelowRangeValueToANullableRangeRestrictedUnsigned8BitInteger_430();
            break;
        case 431:
            ChipLogProgress(chipTool,
                " ***** Test Step 431 : Write just-above-range value to a nullable range-restricted unsigned 8-bit integer\n");
            err = TestWriteJustAboveRangeValueToANullableRangeRestrictedUnsigned8BitInteger_431();
            break;
        case 432:
            ChipLogProgress(
                chipTool, " ***** Test Step 432 : Write max value to a nullable range-restricted unsigned 8-bit integer\n");
            err = TestWriteMaxValueToANullableRangeRestrictedUnsigned8BitInteger_432();
            break;
        case 433:
            ChipLogProgress(
                chipTool, " ***** Test Step 433 : Verify nullable range-restricted unsigned 8-bit integer value has not changed\n");
            err = TestVerifyNullableRangeRestrictedUnsigned8BitIntegerValueHasNotChanged_433();
            break;
        case 434:
            ChipLogProgress(
                chipTool, " ***** Test Step 434 : Write min valid value to a nullable range-restricted unsigned 8-bit integer\n");
            err = TestWriteMinValidValueToANullableRangeRestrictedUnsigned8BitInteger_434();
            break;
        case 435:
            ChipLogProgress(
                chipTool, " ***** Test Step 435 : Verify nullable range-restricted unsigned 8-bit integer value is at min valid\n");
            err = TestVerifyNullableRangeRestrictedUnsigned8BitIntegerValueIsAtMinValid_435();
            break;
        case 436:
            ChipLogProgress(
                chipTool, " ***** Test Step 436 : Write max valid value to a nullable range-restricted unsigned 8-bit integer\n");
            err = TestWriteMaxValidValueToANullableRangeRestrictedUnsigned8BitInteger_436();
            break;
        case 437:
            ChipLogProgress(
                chipTool, " ***** Test Step 437 : Verify nullable range-restricted unsigned 8-bit integer value is at max valid\n");
            err = TestVerifyNullableRangeRestrictedUnsigned8BitIntegerValueIsAtMaxValid_437();
            break;
        case 438:
            ChipLogProgress(chipTool,
                " ***** Test Step 438 : Write middle valid value to a nullable range-restricted unsigned 8-bit integer\n");
            err = TestWriteMiddleValidValueToANullableRangeRestrictedUnsigned8BitInteger_438();
            break;
        case 439:
            ChipLogProgress(
                chipTool, " ***** Test Step 439 : Verify nullable range-restricted unsigned 8-bit integer value is at mid valid\n");
            err = TestVerifyNullableRangeRestrictedUnsigned8BitIntegerValueIsAtMidValid_439();
            break;
        case 440:
            ChipLogProgress(
                chipTool, " ***** Test Step 440 : Write null value to a nullable range-restricted unsigned 8-bit integer\n");
            err = TestWriteNullValueToANullableRangeRestrictedUnsigned8BitInteger_440();
            break;
        case 441:
            ChipLogProgress(
                chipTool, " ***** Test Step 441 : Verify nullable range-restricted unsigned 8-bit integer value is null\n");
            err = TestVerifyNullableRangeRestrictedUnsigned8BitIntegerValueIsNull_441();
            break;
        case 442:
            ChipLogProgress(chipTool, " ***** Test Step 442 : Read nullable range-restricted unsigned 16-bit integer\n");
            err = TestReadNullableRangeRestrictedUnsigned16BitInteger_442();
            break;
        case 443:
            ChipLogProgress(
                chipTool, " ***** Test Step 443 : Write min value to a nullable range-restricted unsigned 16-bit integer\n");
            err = TestWriteMinValueToANullableRangeRestrictedUnsigned16BitInteger_443();
            break;
        case 444:
            ChipLogProgress(chipTool,
                " ***** Test Step 444 : Write just-below-range value to a nullable range-restricted unsigned 16-bit integer\n");
            err = TestWriteJustBelowRangeValueToANullableRangeRestrictedUnsigned16BitInteger_444();
            break;
        case 445:
            ChipLogProgress(chipTool,
                " ***** Test Step 445 : Write just-above-range value to a nullable range-restricted unsigned 16-bit integer\n");
            err = TestWriteJustAboveRangeValueToANullableRangeRestrictedUnsigned16BitInteger_445();
            break;
        case 446:
            ChipLogProgress(
                chipTool, " ***** Test Step 446 : Write max value to a nullable range-restricted unsigned 16-bit integer\n");
            err = TestWriteMaxValueToANullableRangeRestrictedUnsigned16BitInteger_446();
            break;
        case 447:
            ChipLogProgress(chipTool,
                " ***** Test Step 447 : Verify nullable range-restricted unsigned 16-bit integer value has not changed\n");
            err = TestVerifyNullableRangeRestrictedUnsigned16BitIntegerValueHasNotChanged_447();
            break;
        case 448:
            ChipLogProgress(
                chipTool, " ***** Test Step 448 : Write min valid value to a nullable range-restricted unsigned 16-bit integer\n");
            err = TestWriteMinValidValueToANullableRangeRestrictedUnsigned16BitInteger_448();
            break;
        case 449:
            ChipLogProgress(chipTool,
                " ***** Test Step 449 : Verify nullable range-restricted unsigned 16-bit integer value is at min valid\n");
            err = TestVerifyNullableRangeRestrictedUnsigned16BitIntegerValueIsAtMinValid_449();
            break;
        case 450:
            ChipLogProgress(
                chipTool, " ***** Test Step 450 : Write max valid value to a nullable range-restricted unsigned 16-bit integer\n");
            err = TestWriteMaxValidValueToANullableRangeRestrictedUnsigned16BitInteger_450();
            break;
        case 451:
            ChipLogProgress(chipTool,
                " ***** Test Step 451 : Verify nullable range-restricted unsigned 16-bit integer value is at max valid\n");
            err = TestVerifyNullableRangeRestrictedUnsigned16BitIntegerValueIsAtMaxValid_451();
            break;
        case 452:
            ChipLogProgress(chipTool,
                " ***** Test Step 452 : Write middle valid value to a nullable range-restricted unsigned 16-bit integer\n");
            err = TestWriteMiddleValidValueToANullableRangeRestrictedUnsigned16BitInteger_452();
            break;
        case 453:
            ChipLogProgress(chipTool,
                " ***** Test Step 453 : Verify nullable range-restricted unsigned 16-bit integer value is at mid valid\n");
            err = TestVerifyNullableRangeRestrictedUnsigned16BitIntegerValueIsAtMidValid_453();
            break;
        case 454:
            ChipLogProgress(
                chipTool, " ***** Test Step 454 : Write null value to a nullable range-restricted unsigned 16-bit integer\n");
            err = TestWriteNullValueToANullableRangeRestrictedUnsigned16BitInteger_454();
            break;
        case 455:
            ChipLogProgress(
                chipTool, " ***** Test Step 455 : Verify nullable range-restricted unsigned 16-bit integer value is null\n");
            err = TestVerifyNullableRangeRestrictedUnsigned16BitIntegerValueIsNull_455();
            break;
        case 456:
            ChipLogProgress(chipTool, " ***** Test Step 456 : Read nullable range-restricted signed 8-bit integer\n");
            err = TestReadNullableRangeRestrictedSigned8BitInteger_456();
            break;
        case 457:
            ChipLogProgress(
                chipTool, " ***** Test Step 457 : Write min value to a nullable range-restricted signed 8-bit integer\n");
            err = TestWriteMinValueToANullableRangeRestrictedSigned8BitInteger_457();
            break;
        case 458:
            ChipLogProgress(chipTool,
                " ***** Test Step 458 : Write just-below-range value to a nullable range-restricted signed 8-bit integer\n");
            err = TestWriteJustBelowRangeValueToANullableRangeRestrictedSigned8BitInteger_458();
            break;
        case 459:
            ChipLogProgress(chipTool,
                " ***** Test Step 459 : Write just-above-range value to a nullable range-restricted signed 8-bit integer\n");
            err = TestWriteJustAboveRangeValueToANullableRangeRestrictedSigned8BitInteger_459();
            break;
        case 460:
            ChipLogProgress(
                chipTool, " ***** Test Step 460 : Write max value to a nullable range-restricted signed 8-bit integer\n");
            err = TestWriteMaxValueToANullableRangeRestrictedSigned8BitInteger_460();
            break;
        case 461:
            ChipLogProgress(
                chipTool, " ***** Test Step 461 : Verify nullable range-restricted signed 8-bit integer value has not changed\n");
            err = TestVerifyNullableRangeRestrictedSigned8BitIntegerValueHasNotChanged_461();
            break;
        case 462:
            ChipLogProgress(
                chipTool, " ***** Test Step 462 : Write min valid value to a nullable range-restricted signed 8-bit integer\n");
            err = TestWriteMinValidValueToANullableRangeRestrictedSigned8BitInteger_462();
            break;
        case 463:
            ChipLogProgress(
                chipTool, " ***** Test Step 463 : Verify nullable range-restricted signed 8-bit integer value is at min valid\n");
            err = TestVerifyNullableRangeRestrictedSigned8BitIntegerValueIsAtMinValid_463();
            break;
        case 464:
            ChipLogProgress(
                chipTool, " ***** Test Step 464 : Write max valid value to a nullable range-restricted signed 8-bit integer\n");
            err = TestWriteMaxValidValueToANullableRangeRestrictedSigned8BitInteger_464();
            break;
        case 465:
            ChipLogProgress(
                chipTool, " ***** Test Step 465 : Verify nullable range-restricted signed 8-bit integer value is at max valid\n");
            err = TestVerifyNullableRangeRestrictedSigned8BitIntegerValueIsAtMaxValid_465();
            break;
        case 466:
            ChipLogProgress(
                chipTool, " ***** Test Step 466 : Write middle valid value to a nullable range-restricted signed 8-bit integer\n");
            err = TestWriteMiddleValidValueToANullableRangeRestrictedSigned8BitInteger_466();
            break;
        case 467:
            ChipLogProgress(
                chipTool, " ***** Test Step 467 : Verify nullable range-restricted signed 8-bit integer value is at mid valid\n");
            err = TestVerifyNullableRangeRestrictedSigned8BitIntegerValueIsAtMidValid_467();
            break;
        case 468:
            ChipLogProgress(
                chipTool, " ***** Test Step 468 : Write null value to a nullable range-restricted signed 8-bit integer\n");
            err = TestWriteNullValueToANullableRangeRestrictedSigned8BitInteger_468();
            break;
        case 469:
            ChipLogProgress(
                chipTool, " ***** Test Step 469 : Verify nullable range-restricted signed 8-bit integer value is at null\n");
            err = TestVerifyNullableRangeRestrictedSigned8BitIntegerValueIsAtNull_469();
            break;
        case 470:
            ChipLogProgress(chipTool, " ***** Test Step 470 : Read nullable range-restricted signed 16-bit integer\n");
            err = TestReadNullableRangeRestrictedSigned16BitInteger_470();
            break;
        case 471:
            ChipLogProgress(
                chipTool, " ***** Test Step 471 : Write min value to a nullable range-restricted signed 16-bit integer\n");
            err = TestWriteMinValueToANullableRangeRestrictedSigned16BitInteger_471();
            break;
        case 472:
            ChipLogProgress(chipTool,
                " ***** Test Step 472 : Write just-below-range value to a nullable range-restricted signed 16-bit integer\n");
            err = TestWriteJustBelowRangeValueToANullableRangeRestrictedSigned16BitInteger_472();
            break;
        case 473:
            ChipLogProgress(chipTool,
                " ***** Test Step 473 : Write just-above-range value to a nullable range-restricted signed 16-bit integer\n");
            err = TestWriteJustAboveRangeValueToANullableRangeRestrictedSigned16BitInteger_473();
            break;
        case 474:
            ChipLogProgress(
                chipTool, " ***** Test Step 474 : Write max value to a nullable range-restricted signed 16-bit integer\n");
            err = TestWriteMaxValueToANullableRangeRestrictedSigned16BitInteger_474();
            break;
        case 475:
            ChipLogProgress(
                chipTool, " ***** Test Step 475 : Verify nullable range-restricted signed 16-bit integer value has not changed\n");
            err = TestVerifyNullableRangeRestrictedSigned16BitIntegerValueHasNotChanged_475();
            break;
        case 476:
            ChipLogProgress(
                chipTool, " ***** Test Step 476 : Write min valid value to a nullable range-restricted signed 16-bit integer\n");
            err = TestWriteMinValidValueToANullableRangeRestrictedSigned16BitInteger_476();
            break;
        case 477:
            ChipLogProgress(
                chipTool, " ***** Test Step 477 : Verify nullable range-restricted signed 16-bit integer value is at min valid\n");
            err = TestVerifyNullableRangeRestrictedSigned16BitIntegerValueIsAtMinValid_477();
            break;
        case 478:
            ChipLogProgress(
                chipTool, " ***** Test Step 478 : Write max valid value to a nullable range-restricted signed 16-bit integer\n");
            err = TestWriteMaxValidValueToANullableRangeRestrictedSigned16BitInteger_478();
            break;
        case 479:
            ChipLogProgress(
                chipTool, " ***** Test Step 479 : Verify nullable range-restricted signed 16-bit integer value is at max valid\n");
            err = TestVerifyNullableRangeRestrictedSigned16BitIntegerValueIsAtMaxValid_479();
            break;
        case 480:
            ChipLogProgress(
                chipTool, " ***** Test Step 480 : Write middle valid value to a nullable range-restricted signed 16-bit integer\n");
            err = TestWriteMiddleValidValueToANullableRangeRestrictedSigned16BitInteger_480();
            break;
        case 481:
            ChipLogProgress(
                chipTool, " ***** Test Step 481 : Verify nullable range-restricted signed 16-bit integer value is at mid valid\n");
            err = TestVerifyNullableRangeRestrictedSigned16BitIntegerValueIsAtMidValid_481();
            break;
        case 482:
            ChipLogProgress(
                chipTool, " ***** Test Step 482 : Write null value to a nullable range-restricted signed 16-bit integer\n");
            err = TestWriteNullValueToANullableRangeRestrictedSigned16BitInteger_482();
            break;
        case 483:
            ChipLogProgress(
                chipTool, " ***** Test Step 483 : Verify nullable range-restricted signed 16-bit integer value is null\n");
            err = TestVerifyNullableRangeRestrictedSigned16BitIntegerValueIsNull_483();
            break;
        case 484:
            ChipLogProgress(chipTool, " ***** Test Step 484 : Write attribute that returns general status on write\n");
            err = TestWriteAttributeThatReturnsGeneralStatusOnWrite_484();
            break;
        case 485:
            ChipLogProgress(chipTool, " ***** Test Step 485 : Write attribute that returns cluster-specific status on write\n");
            err = TestWriteAttributeThatReturnsClusterSpecificStatusOnWrite_485();
            break;
        case 486:
            ChipLogProgress(chipTool, " ***** Test Step 486 : Read attribute that returns general status on read\n");
            err = TestReadAttributeThatReturnsGeneralStatusOnRead_486();
            break;
        case 487:
            ChipLogProgress(chipTool, " ***** Test Step 487 : read attribute that returns cluster-specific status on read\n");
            err = TestReadAttributeThatReturnsClusterSpecificStatusOnRead_487();
            break;
        case 488:
            ChipLogProgress(chipTool, " ***** Test Step 488 : read AcceptedCommandList attribute\n");
            err = TestReadAcceptedCommandListAttribute_488();
            break;
        case 489:
            ChipLogProgress(chipTool, " ***** Test Step 489 : read GeneratedCommandList attribute\n");
            err = TestReadGeneratedCommandListAttribute_489();
            break;
        case 490:
            ChipLogProgress(chipTool, " ***** Test Step 490 : Write struct-typed attribute\n");
            err = TestWriteStructTypedAttribute_490();
            break;
        case 491:
            ChipLogProgress(chipTool, " ***** Test Step 491 : Read struct-typed attribute\n");
            err = TestReadStructTypedAttribute_491();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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_INVALID_COMMAND));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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));
            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));
            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));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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));
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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));
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 46:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 50:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 51:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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));
            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));
            break;
        case 58:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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));
            break;
        case 61:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 70:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 71:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 72:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 73:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 77:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 78:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 79:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 80:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 81:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 82:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 83:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 87:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 88:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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));
            break;
        case 91:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 92:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 93:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 94:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 95:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 96:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 101:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 102:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 103:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 104:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 105:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 106:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 107:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 108:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 109:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 110:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 111:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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));
            break;
        case 118:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 119:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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));
            break;
        case 122:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 123:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 124:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 125:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 126:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 127:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 128:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 129:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 130:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 131:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 132:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 133:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 134:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 135:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 136:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 137:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 138:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 139:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 140:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 141:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 142:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 143:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 144:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 145:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 146:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 147:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 148:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 149:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_ENDPOINT));
            break;
        case 150:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_CLUSTER));
            break;
        case 151:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 152:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 153:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 154:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 155:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 156:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 157:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 158:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 159:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 160:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 161:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 162:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 163:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 164:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 165:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 166:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 167:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 168:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 169:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 170:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 171:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 172:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 173:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 174:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 175:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 176:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 177:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 178:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 179:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 180:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 181:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 182:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 183:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 184:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 185:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 186:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 187:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 188:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 189:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 190:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 191:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 192:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 193:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 194:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 195:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 196:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 197:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 198:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 199:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 200:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 201:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 202:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 203:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 204:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 205:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 206:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 207:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 208:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 209:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 210:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 211:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 212:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 213:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 214:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 215:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 216:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 217:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 218:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 219:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 220:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 221:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 222:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 223:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 224:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 225:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 226:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 227:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 228:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 229:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 230:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 231:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 232:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 233:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 234:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 235:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 236:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 237:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 238:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 239:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 240:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 241:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 242:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 243:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 244:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 245:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 246:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 247:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 248:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 249:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 250:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 251:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 252:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 253:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 254:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 255:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 256:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 257:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 258:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 259:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 260:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 261:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 262:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 263:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 264:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 265:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 266:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 267:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 268:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 269:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 270:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 271:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 272:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 273:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 274:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 275:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 276:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 277:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 278:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 279:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 280:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 281:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 282:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 283:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 284:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 285:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 286:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 287:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 288:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 289:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 290:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 291:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 292:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 293:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 294:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 295:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 296:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 297:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 298:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 299:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 300:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 301:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 302:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 303:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 304:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 305:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 306:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 307:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 308:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 309:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 310:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 311:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 312:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 313:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 314:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 315:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 316:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 317:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 318:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 319:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 320:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 321:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 322:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 323:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 324:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 325:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 326:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 327:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 328:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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));
            break;
        case 331:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 332:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 333:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 334:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 335:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 336:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 337:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 338:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 339:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 340:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 341:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 342:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 343:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 344:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 345:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 346:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 347:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 348:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 349:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 350:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 351:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 352:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 353:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 354:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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));
            break;
        case 357:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 358:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 359:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 360:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 361:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 362:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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));
            break;
        case 365:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 366:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 367:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 368:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 369:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 370:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 371:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 372:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_ENDPOINT));
            break;
        case 373:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_CLUSTER));
            break;
        case 374:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 375:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 376:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 377:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 378:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 379:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 380:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 384:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 385:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 386:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 387:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 388:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 389:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 390:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 391:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 392:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 396:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 397:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 398:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 399:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 400:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 401:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 402:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 403:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 404:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 408:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 409:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 410:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 411:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 412:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 413:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 414:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 415:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 416:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 420:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 421:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 422:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 423:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 424:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 425:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 426:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 427:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 428:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 432:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 433:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 434:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 435:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 436:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 437:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 438:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 439:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 440:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 441:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 442:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 446:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 447:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 448:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 449:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 450:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 451:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 452:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 453:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 454:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 455:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 456:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 460:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 461:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 462:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 463:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 464:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 465:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 466:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 467:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 468:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 469:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 470:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 474:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 475:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 476:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 477:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 478:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 479:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 480:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 481:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 482:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 483:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), EMBER_ZCL_STATUS_INVALID_DATA_TYPE));
            break;
        case 487:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 488:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 489:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 490:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 491:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 492;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestSendTestCommand_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster testWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Send Test Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestNotHandledCommand_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster testNotHandledWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Send Test Not Handled Command Error: %@", err);

            VerifyOrReturn(CheckValue("status",
                err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE) : 0,
                EMBER_ZCL_STATUS_INVALID_COMMAND));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestSpecificCommand_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster testSpecificWithCompletion:^(
            MTRUnitTestingClusterTestSpecificResponseParams * _Nullable values, NSError * _Nullable err) {
            NSLog(@"Send Test Specific Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = values.returnValue;
                VerifyOrReturn(CheckValue("returnValue", actualValue, 7U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestAddArgumentsCommand_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestAddArgumentsParams alloc] init];
        params.arg1 = [NSNumber numberWithUnsignedChar:3U];
        params.arg2 = [NSNumber numberWithUnsignedChar:17U];
        [cluster testAddArgumentsWithParams:params
                                 completion:^(MTRUnitTestingClusterTestAddArgumentsResponseParams * _Nullable values,
                                     NSError * _Nullable err) {
                                     NSLog(@"Send Test Add Arguments Command Error: %@", err);

                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                     {
                                         id actualValue = values.returnValue;
                                         VerifyOrReturn(CheckValue("returnValue", actualValue, 20U));
                                     }

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendFailingTestAddArgumentsCommand_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestAddArgumentsParams alloc] init];
        params.arg1 = [NSNumber numberWithUnsignedChar:250U];
        params.arg2 = [NSNumber numberWithUnsignedChar:6U];
        [cluster testAddArgumentsWithParams:params
                                 completion:^(MTRUnitTestingClusterTestAddArgumentsResponseParams * _Nullable values,
                                     NSError * _Nullable err) {
                                     NSLog(@"Send failing Test Add Arguments Command Error: %@", err);

                                     VerifyOrReturn(CheckValue("status",
                                         err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                       : EMBER_ZCL_STATUS_FAILURE)
                                             : 0,
                                         EMBER_ZCL_STATUS_INVALID_COMMAND));
                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBooleanDefaultValue_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBooleanWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BOOLEAN Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("boolean", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeBooleanTrue_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id booleanArgument;
        booleanArgument = [NSNumber numberWithBool:1];
        [cluster writeAttributeBooleanWithValue:booleanArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Write attribute BOOLEAN True Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBooleanTrue_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBooleanWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BOOLEAN True Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("boolean", actualValue, 1));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeBooleanFalse_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id booleanArgument;
        booleanArgument = [NSNumber numberWithBool:0];
        [cluster writeAttributeBooleanWithValue:booleanArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Write attribute BOOLEAN False Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBooleanFalse_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBooleanWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BOOLEAN False Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("boolean", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap8DefaultValue_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP8 Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap8", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeBitmap8MaxValue_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap8Argument;
        bitmap8Argument = [NSNumber numberWithUnsignedChar:255U];
        [cluster writeAttributeBitmap8WithValue:bitmap8Argument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Write attribute BITMAP8 Max Value Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap8MaxValue_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP8 Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap8", actualValue, 255U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeBitmap8MinValue_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap8Argument;
        bitmap8Argument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeBitmap8WithValue:bitmap8Argument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Write attribute BITMAP8 Min Value Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap8MinValue_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP8 Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap8", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap16DefaultValue_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP16 Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap16", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeBitmap16MaxValue_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap16Argument;
        bitmap16Argument = [NSNumber numberWithUnsignedShort:65535U];
        [cluster writeAttributeBitmap16WithValue:bitmap16Argument
                                      completion:^(NSError * _Nullable err) {
                                          NSLog(@"Write attribute BITMAP16 Max Value Error: %@", err);

                                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                          NextTest();
                                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap16MaxValue_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP16 Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap16", actualValue, 65535U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeBitmap16MinValue_19()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap16Argument;
        bitmap16Argument = [NSNumber numberWithUnsignedShort:0U];
        [cluster writeAttributeBitmap16WithValue:bitmap16Argument
                                      completion:^(NSError * _Nullable err) {
                                          NSLog(@"Write attribute BITMAP16 Min Value Error: %@", err);

                                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                          NextTest();
                                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap16MinValue_20()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP16 Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap16", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap32DefaultValue_21()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap32WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP32 Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap32", actualValue, 0UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeBitmap32MaxValue_22()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap32Argument;
        bitmap32Argument = [NSNumber numberWithUnsignedInt:4294967295UL];
        [cluster writeAttributeBitmap32WithValue:bitmap32Argument
                                      completion:^(NSError * _Nullable err) {
                                          NSLog(@"Write attribute BITMAP32 Max Value Error: %@", err);

                                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                          NextTest();
                                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap32MaxValue_23()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap32WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP32 Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap32", actualValue, 4294967295UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeBitmap32MinValue_24()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap32Argument;
        bitmap32Argument = [NSNumber numberWithUnsignedInt:0UL];
        [cluster writeAttributeBitmap32WithValue:bitmap32Argument
                                      completion:^(NSError * _Nullable err) {
                                          NSLog(@"Write attribute BITMAP32 Min Value Error: %@", err);

                                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                          NextTest();
                                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap32MinValue_25()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap32WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP32 Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap32", actualValue, 0UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap64DefaultValue_26()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap64WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP64 Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap64", actualValue, 0ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeBitmap64MaxValue_27()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap64Argument;
        bitmap64Argument = [NSNumber numberWithUnsignedLongLong:18446744073709551615ULL];
        [cluster writeAttributeBitmap64WithValue:bitmap64Argument
                                      completion:^(NSError * _Nullable err) {
                                          NSLog(@"Write attribute BITMAP64 Max Value Error: %@", err);

                                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                          NextTest();
                                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap64MaxValue_28()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap64WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP64 Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap64", actualValue, 18446744073709551615ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeBitmap64MinValue_29()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap64Argument;
        bitmap64Argument = [NSNumber numberWithUnsignedLongLong:0ULL];
        [cluster writeAttributeBitmap64WithValue:bitmap64Argument
                                      completion:^(NSError * _Nullable err) {
                                          NSLog(@"Write attribute BITMAP64 Min Value Error: %@", err);

                                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                          NextTest();
                                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap64MinValue_30()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap64WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP64 Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap64", actualValue, 0ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt8uDefaultValue_31()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT8U Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int8u", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt8uMaxValue_32()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int8uArgument;
        int8uArgument = [NSNumber numberWithUnsignedChar:255U];
        [cluster writeAttributeInt8uWithValue:int8uArgument
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Write attribute INT8U Max Value Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt8uMaxValue_33()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT8U Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int8u", actualValue, 255U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt8uMinValue_34()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int8uArgument;
        int8uArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeInt8uWithValue:int8uArgument
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Write attribute INT8U Min Value Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt8uMinValue_35()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT8U Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int8u", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt16uDefaultValue_36()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT16U Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int16u", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt16uMaxValue_37()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int16uArgument;
        int16uArgument = [NSNumber numberWithUnsignedShort:65535U];
        [cluster writeAttributeInt16uWithValue:int16uArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT16U Max Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt16uMaxValue_38()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT16U Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int16u", actualValue, 65535U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt16uMinValue_39()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int16uArgument;
        int16uArgument = [NSNumber numberWithUnsignedShort:0U];
        [cluster writeAttributeInt16uWithValue:int16uArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT16U Min Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt16uMinValue_40()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT16U Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int16u", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt32uDefaultValue_41()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT32U Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int32u", actualValue, 0UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt32uMaxValue_42()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int32uArgument;
        int32uArgument = [NSNumber numberWithUnsignedInt:4294967295UL];
        [cluster writeAttributeInt32uWithValue:int32uArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT32U Max Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt32uMaxValue_43()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT32U Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int32u", actualValue, 4294967295UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt32uMinValue_44()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int32uArgument;
        int32uArgument = [NSNumber numberWithUnsignedInt:0UL];
        [cluster writeAttributeInt32uWithValue:int32uArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT32U Min Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt32uMinValue_45()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT32U Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int32u", actualValue, 0UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt64uDefaultValue_46()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt64uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT64U Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int64u", actualValue, 0ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt64uMaxValue_47()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int64uArgument;
        int64uArgument = [NSNumber numberWithUnsignedLongLong:18446744073709551615ULL];
        [cluster writeAttributeInt64uWithValue:int64uArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT64U Max Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt64uMaxValue_48()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt64uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT64U Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int64u", actualValue, 18446744073709551615ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt64uMinValue_49()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int64uArgument;
        int64uArgument = [NSNumber numberWithUnsignedLongLong:0ULL];
        [cluster writeAttributeInt64uWithValue:int64uArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT64U Min Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt64uMinValue_50()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt64uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT64U Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int64u", actualValue, 0ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt8sDefaultValue_51()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT8S Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int8s", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt8sMaxValue_52()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int8sArgument;
        int8sArgument = [NSNumber numberWithChar:127];
        [cluster writeAttributeInt8sWithValue:int8sArgument
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Write attribute INT8S Max Value Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt8sMaxValue_53()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT8S Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int8s", actualValue, 127));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt8sMinValue_54()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int8sArgument;
        int8sArgument = [NSNumber numberWithChar:-128];
        [cluster writeAttributeInt8sWithValue:int8sArgument
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Write attribute INT8S Min Value Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt8sMinValue_55()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT8S Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int8s", actualValue, -128));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt8sDefaultValue_56()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int8sArgument;
        int8sArgument = [NSNumber numberWithChar:0];
        [cluster writeAttributeInt8sWithValue:int8sArgument
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Write attribute INT8S Default Value Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt8sDefaultValue_57()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT8S Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int8s", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt16sDefaultValue_58()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT16S Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int16s", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt16sMaxValue_59()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int16sArgument;
        int16sArgument = [NSNumber numberWithShort:32767];
        [cluster writeAttributeInt16sWithValue:int16sArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT16S Max Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt16sMaxValue_60()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT16S Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int16s", actualValue, 32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt16sMinValue_61()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int16sArgument;
        int16sArgument = [NSNumber numberWithShort:-32768];
        [cluster writeAttributeInt16sWithValue:int16sArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT16S Min Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt16sMinValue_62()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT16S Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int16s", actualValue, -32768));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt16sDefaultValue_63()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int16sArgument;
        int16sArgument = [NSNumber numberWithShort:0];
        [cluster writeAttributeInt16sWithValue:int16sArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT16S Default Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt16sDefaultValue_64()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT16S Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int16s", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt32sDefaultValue_65()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT32S Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int32s", actualValue, 0L));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt32sMaxValue_66()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int32sArgument;
        int32sArgument = [NSNumber numberWithInt:2147483647L];
        [cluster writeAttributeInt32sWithValue:int32sArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT32S Max Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt32sMaxValue_67()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT32S Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int32s", actualValue, 2147483647L));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt32sMinValue_68()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int32sArgument;
        int32sArgument = [NSNumber numberWithInt:-2147483648L];
        [cluster writeAttributeInt32sWithValue:int32sArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT32S Min Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt32sMinValue_69()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT32S Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int32s", actualValue, -2147483648L));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt32sDefaultValue_70()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int32sArgument;
        int32sArgument = [NSNumber numberWithInt:0L];
        [cluster writeAttributeInt32sWithValue:int32sArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT32S Default Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt32sDefaultValue_71()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT32S Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int32s", actualValue, 0L));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt64sDefaultValue_72()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt64sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT64S Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int64s", actualValue, 0LL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt64sMaxValue_73()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int64sArgument;
        int64sArgument = [NSNumber numberWithLongLong:9223372036854775807LL];
        [cluster writeAttributeInt64sWithValue:int64sArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT64S Max Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt64sMaxValue_74()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt64sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT64S Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int64s", actualValue, 9223372036854775807LL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt64sMinValue_75()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int64sArgument;
        int64sArgument = [NSNumber numberWithLongLong:-9223372036854775807LL];
        [cluster writeAttributeInt64sWithValue:int64sArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT64S Min Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt64sMinValue_76()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt64sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT64S Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int64s", actualValue, -9223372036854775807LL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt64sDefaultValue_77()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int64sArgument;
        int64sArgument = [NSNumber numberWithLongLong:0LL];
        [cluster writeAttributeInt64sWithValue:int64sArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT64S Default Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt64sDefaultValue_78()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt64sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT64S Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int64s", actualValue, 0LL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeSingleDefaultValue_79()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFloatSingleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute SINGLE Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("float_single", actualValue, 0.0f));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeSingleMediumValue_80()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id floatSingleArgument;
        floatSingleArgument = [NSNumber numberWithFloat:0.1f];
        [cluster writeAttributeFloatSingleWithValue:floatSingleArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write attribute SINGLE medium Value Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeSingleMediumValue_81()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFloatSingleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute SINGLE medium Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("float_single", actualValue, 0.1f));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeSingleLargeValue_82()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id floatSingleArgument;
        floatSingleArgument = [NSNumber numberWithFloat:17000000000.0f];
        [cluster writeAttributeFloatSingleWithValue:floatSingleArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write attribute SINGLE large Value Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeSingleLargeValue_83()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFloatSingleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute SINGLE large Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("float_single", actualValue, 17000000000.0f));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeSingleSmallValue_84()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id floatSingleArgument;
        floatSingleArgument = [NSNumber numberWithFloat:1.7e-10f];
        [cluster writeAttributeFloatSingleWithValue:floatSingleArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write attribute SINGLE small Value Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeSingleSmallValue_85()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFloatSingleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute SINGLE small Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("float_single", actualValue, 1.7e-10f));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeSingleDefaultValue_86()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id floatSingleArgument;
        floatSingleArgument = [NSNumber numberWithFloat:0.0f];
        [cluster writeAttributeFloatSingleWithValue:floatSingleArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write attribute SINGLE Default Value Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeSingleDefaultValue_87()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFloatSingleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute SINGLE Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("float_single", actualValue, 0.0f));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeDoubleDefaultValue_88()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFloatDoubleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute DOUBLE Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("float_double", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeDoubleMediumValue_89()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id floatDoubleArgument;
        floatDoubleArgument = [NSNumber numberWithDouble:0.1234567890123];
        [cluster writeAttributeFloatDoubleWithValue:floatDoubleArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write attribute DOUBLE medium Value Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeDoubleMediumValue_90()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFloatDoubleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute DOUBLE medium Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("float_double", actualValue, 0.1234567890123));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeDoubleLargeValue_91()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id floatDoubleArgument;
        floatDoubleArgument = [NSNumber numberWithDouble:1.7e+200];
        [cluster writeAttributeFloatDoubleWithValue:floatDoubleArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write attribute DOUBLE large Value Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeDoubleLargeValue_92()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFloatDoubleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute DOUBLE large Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("float_double", actualValue, 1.7e+200));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeDoubleSmallValue_93()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id floatDoubleArgument;
        floatDoubleArgument = [NSNumber numberWithDouble:1.7e-200];
        [cluster writeAttributeFloatDoubleWithValue:floatDoubleArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write attribute DOUBLE small Value Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeDoubleSmallValue_94()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFloatDoubleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute DOUBLE small Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("float_double", actualValue, 1.7e-200));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeDoubleDefaultValue_95()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id floatDoubleArgument;
        floatDoubleArgument = [NSNumber numberWithDouble:0];
        [cluster writeAttributeFloatDoubleWithValue:floatDoubleArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write attribute DOUBLE Default Value Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeDoubleDefaultValue_96()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFloatDoubleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute DOUBLE Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("float_double", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeEnum8DefaultValue_97()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnum8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute ENUM8 Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("enum8", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeEnum8MaxValue_98()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id enum8Argument;
        enum8Argument = [NSNumber numberWithUnsignedChar:255U];
        [cluster writeAttributeEnum8WithValue:enum8Argument
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Write attribute ENUM8 Max Value Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeEnum8MaxValue_99()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnum8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute ENUM8 Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("enum8", actualValue, 255U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeEnum8MinValue_100()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id enum8Argument;
        enum8Argument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeEnum8WithValue:enum8Argument
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Write attribute ENUM8 Min Value Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeEnum8MinValue_101()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnum8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute ENUM8 Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("enum8", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeEnum16DefaultValue_102()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnum16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute ENUM16 Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("enum16", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeEnum16MaxValue_103()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id enum16Argument;
        enum16Argument = [NSNumber numberWithUnsignedShort:65535U];
        [cluster writeAttributeEnum16WithValue:enum16Argument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute ENUM16 Max Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeEnum16MaxValue_104()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnum16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute ENUM16 Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("enum16", actualValue, 65535U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeEnum16MinValue_105()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id enum16Argument;
        enum16Argument = [NSNumber numberWithUnsignedShort:0U];
        [cluster writeAttributeEnum16WithValue:enum16Argument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute ENUM16 Min Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeEnum16MinValue_106()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnum16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute ENUM16 Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("enum16", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeOctetStringDefaultValue_107()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute OCTET_STRING Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("octet_string", actualValue, [[NSData alloc] initWithBytes:"" length:0]));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeOctetStringWithEmbeddedNull_108()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id octetStringArgument;
        octetStringArgument = [[NSData alloc] initWithBytes:"Tes\000ti\000ng" length:9];
        [cluster writeAttributeOctetStringWithValue:octetStringArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write attribute OCTET_STRING with embedded null Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeOctetStringWithEmbeddedNull_109()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute OCTET_STRING with embedded null Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(
                    CheckValueAsString("octet_string", actualValue, [[NSData alloc] initWithBytes:"Tes\000ti\000ng" length:9]));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeOctetStringWithHexFormat_110()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id octetStringArgument;
        octetStringArgument = [[NSData alloc] initWithBytes:"\x00\x01\x02\x03\x04\x05" length:6];
        [cluster writeAttributeOctetStringWithValue:octetStringArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write attribute OCTET_STRING with hex: format Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeOctetStringWithHexFormat_111()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute OCTET_STRING with hex: format Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString(
                    "octet_string", actualValue, [[NSData alloc] initWithBytes:"\x00\x01\x02\x03\x04\x05" length:6]));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeOctetStringWithWeirdChars_112()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id octetStringArgument;
        octetStringArgument = [[NSData alloc] initWithBytes:"\015\012\377\042\240" length:5];
        [cluster writeAttributeOctetStringWithValue:octetStringArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write attribute OCTET_STRING with weird chars Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeOctetStringWithWeirdChars_113()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute OCTET_STRING with weird chars Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString(
                    "octet_string", actualValue, [[NSData alloc] initWithBytes:"\x0d\x0a\xff\x22\xa0" length:5]));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeOctetString_114()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id octetStringArgument;
        octetStringArgument = [[NSData alloc] initWithBytes:"TestValue" length:9];
        [cluster writeAttributeOctetStringWithValue:octetStringArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write attribute OCTET_STRING Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeOctetString_115()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute OCTET_STRING Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(
                    CheckValueAsString("octet_string", actualValue, [[NSData alloc] initWithBytes:"TestValue" length:9]));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeOctetString_116()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id octetStringArgument;
        octetStringArgument = [[NSData alloc] initWithBytes:"TestValueLongerThan10" length:21];
        [cluster writeAttributeOctetStringWithValue:octetStringArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write attribute OCTET_STRING Error: %@", err);

                                             VerifyOrReturn(CheckValue("status",
                                                 err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                         ? err.code
                                                         : EMBER_ZCL_STATUS_FAILURE)
                                                     : 0,
                                                 EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeOctetString_117()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute OCTET_STRING Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(
                    CheckValueAsString("octet_string", actualValue, [[NSData alloc] initWithBytes:"TestValue" length:9]));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeOctetString_118()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id octetStringArgument;
        octetStringArgument = [[NSData alloc] initWithBytes:"" length:0];
        [cluster writeAttributeOctetStringWithValue:octetStringArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write attribute OCTET_STRING Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeLongOctetStringDefaultValue_119()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLongOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute LONG_OCTET_STRING Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("long_octet_string", actualValue, [[NSData alloc] initWithBytes:"" length:0]));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeLongOctetString_120()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id longOctetStringArgument;
        longOctetStringArgument = [[NSData alloc]
            initWithBytes:"11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
                          "11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
                          "11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
                   length:300];
        [cluster writeAttributeLongOctetStringWithValue:longOctetStringArgument
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"Write attribute LONG_OCTET_STRING Error: %@", err);

                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeLongOctetString_121()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLongOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute LONG_OCTET_STRING Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("long_octet_string", actualValue,
                    [[NSData alloc]
                        initWithBytes:
                            "111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
                            "111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
                            "111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
                               length:300]));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeLongOctetString_122()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id longOctetStringArgument;
        longOctetStringArgument = [[NSData alloc] initWithBytes:"" length:0];
        [cluster writeAttributeLongOctetStringWithValue:longOctetStringArgument
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"Write attribute LONG_OCTET_STRING Error: %@", err);

                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeCharStringDefaultValue_123()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute CHAR_STRING Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("char_string", actualValue, @""));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeCharString_124()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id charStringArgument;
        charStringArgument = @"☉T☉";
        [cluster writeAttributeCharStringWithValue:charStringArgument
                                        completion:^(NSError * _Nullable err) {
                                            NSLog(@"Write attribute CHAR_STRING Error: %@", err);

                                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                            NextTest();
                                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeCharString_125()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute CHAR_STRING Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("char_string", actualValue, @"☉T☉"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeCharStringValueTooLong_126()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id charStringArgument;
        charStringArgument = @"☉TestValueLongerThan10☉";
        [cluster
            writeAttributeCharStringWithValue:charStringArgument
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Write attribute CHAR_STRING - Value too long Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeCharString_127()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute CHAR_STRING Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("char_string", actualValue, @"☉T☉"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeCharStringEmpty_128()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id charStringArgument;
        charStringArgument = @"";
        [cluster writeAttributeCharStringWithValue:charStringArgument
                                        completion:^(NSError * _Nullable err) {
                                            NSLog(@"Write attribute CHAR_STRING - Empty Error: %@", err);

                                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                            NextTest();
                                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeLongCharStringDefaultValue_129()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLongCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute LONG_CHAR_STRING Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("long_char_string", actualValue, @""));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeLongCharString_130()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id longCharStringArgument;
        longCharStringArgument
            = @"☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉"
              @"☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉"
              @"☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉";
        [cluster writeAttributeLongCharStringWithValue:longCharStringArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute LONG_CHAR_STRING Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeLongCharString_131()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLongCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute LONG_CHAR_STRING Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("long_char_string", actualValue,
                    @"☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉"
                    @"☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉"
                    @"☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeLongCharString_132()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id longCharStringArgument;
        longCharStringArgument = @"";
        [cluster writeAttributeLongCharStringWithValue:longCharStringArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute LONG_CHAR_STRING Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeListLongOctetStringForChunkedRead_133()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeListLongOctetStringWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute LIST_LONG_OCTET_STRING (for chunked read) Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("list_long_octet_string", [actualValue count], static_cast<uint32_t>(4)));
                VerifyOrReturn(CheckValueAsString("", actualValue[0],
                    [[NSData alloc]
                        initWithBytes:"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                      "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567"
                                      "89abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123"
                                      "456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
                                      "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                      "cdef0123456789abcdef0123456789abcdef0123456789abcdef"
                               length:512]));
                VerifyOrReturn(CheckValueAsString("", actualValue[1],
                    [[NSData alloc]
                        initWithBytes:"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                      "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567"
                                      "89abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123"
                                      "456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
                                      "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                      "cdef0123456789abcdef0123456789abcdef0123456789abcdef"
                               length:512]));
                VerifyOrReturn(CheckValueAsString("", actualValue[2],
                    [[NSData alloc]
                        initWithBytes:"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                      "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567"
                                      "89abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123"
                                      "456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
                                      "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                      "cdef0123456789abcdef0123456789abcdef0123456789abcdef"
                               length:512]));
                VerifyOrReturn(CheckValueAsString("", actualValue[3],
                    [[NSData alloc]
                        initWithBytes:"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                      "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567"
                                      "89abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123"
                                      "456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
                                      "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                      "cdef0123456789abcdef0123456789abcdef0123456789abcdef"
                               length:512]));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeListLongOctetStringForChunkedWrite_134()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id listLongOctetStringArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[NSData alloc]
                initWithBytes:
                    "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
                    "ef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                    "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789"
                    "abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567"
                    "89abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
                       length:512];
            temp_0[1] = [[NSData alloc]
                initWithBytes:
                    "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
                    "ef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                    "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789"
                    "abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567"
                    "89abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
                       length:512];
            temp_0[2] = [[NSData alloc]
                initWithBytes:
                    "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
                    "ef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                    "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789"
                    "abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567"
                    "89abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
                       length:512];
            temp_0[3] = [[NSData alloc]
                initWithBytes:
                    "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
                    "ef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                    "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789"
                    "abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567"
                    "89abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
                       length:512];
            temp_0[4] = [[NSData alloc]
                initWithBytes:
                    "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
                    "ef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                    "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789"
                    "abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567"
                    "89abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
                       length:512];
            listLongOctetStringArgument = temp_0;
        }
        [cluster
            writeAttributeListLongOctetStringWithValue:listLongOctetStringArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute LIST_LONG_OCTET_STRING (for chunked write) Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeListLongOctetStringForChunkedRead_135()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeListLongOctetStringWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute LIST_LONG_OCTET_STRING (for chunked read) Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("list_long_octet_string", [actualValue count], static_cast<uint32_t>(5)));
                VerifyOrReturn(CheckValueAsString("", actualValue[0],
                    [[NSData alloc]
                        initWithBytes:"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                      "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567"
                                      "89abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123"
                                      "456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
                                      "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                      "cdef0123456789abcdef0123456789abcdef0123456789abcdef"
                               length:512]));
                VerifyOrReturn(CheckValueAsString("", actualValue[1],
                    [[NSData alloc]
                        initWithBytes:"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                      "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567"
                                      "89abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123"
                                      "456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
                                      "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                      "cdef0123456789abcdef0123456789abcdef0123456789abcdef"
                               length:512]));
                VerifyOrReturn(CheckValueAsString("", actualValue[2],
                    [[NSData alloc]
                        initWithBytes:"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                      "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567"
                                      "89abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123"
                                      "456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
                                      "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                      "cdef0123456789abcdef0123456789abcdef0123456789abcdef"
                               length:512]));
                VerifyOrReturn(CheckValueAsString("", actualValue[3],
                    [[NSData alloc]
                        initWithBytes:"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                      "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567"
                                      "89abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123"
                                      "456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
                                      "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                      "cdef0123456789abcdef0123456789abcdef0123456789abcdef"
                               length:512]));
                VerifyOrReturn(CheckValueAsString("", actualValue[4],
                    [[NSData alloc]
                        initWithBytes:"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                      "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567"
                                      "89abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123"
                                      "456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
                                      "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                                      "cdef0123456789abcdef0123456789abcdef0123456789abcdef"
                               length:512]));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeListLongOctetStringForChunkedWrite_136()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id listLongOctetStringArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[NSData alloc]
                initWithBytes:
                    "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
                    "ef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                    "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789"
                    "abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567"
                    "89abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
                       length:512];
            temp_0[1] = [[NSData alloc]
                initWithBytes:
                    "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
                    "ef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                    "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789"
                    "abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567"
                    "89abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
                       length:512];
            temp_0[2] = [[NSData alloc]
                initWithBytes:
                    "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
                    "ef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                    "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789"
                    "abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567"
                    "89abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
                       length:512];
            temp_0[3] = [[NSData alloc]
                initWithBytes:
                    "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
                    "ef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab"
                    "cdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789"
                    "abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01234567"
                    "89abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
                       length:512];
            listLongOctetStringArgument = temp_0;
        }
        [cluster
            writeAttributeListLongOctetStringWithValue:listLongOctetStringArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute LIST_LONG_OCTET_STRING (for chunked write) Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeEpochUsDefaultValue_137()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEpochUsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute EPOCH_US Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("epoch_us", actualValue, 0ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeEpochUsMaxValue_138()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id epochUsArgument;
        epochUsArgument = [NSNumber numberWithUnsignedLongLong:18446744073709551615ULL];
        [cluster writeAttributeEpochUsWithValue:epochUsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Write attribute EPOCH_US Max Value Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeEpochUsMaxValue_139()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEpochUsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute EPOCH_US Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("epoch_us", actualValue, 18446744073709551615ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeEpochUsMinValue_140()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id epochUsArgument;
        epochUsArgument = [NSNumber numberWithUnsignedLongLong:0ULL];
        [cluster writeAttributeEpochUsWithValue:epochUsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Write attribute EPOCH_US Min Value Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeEpochUsMinValue_141()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEpochUsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute EPOCH_US Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("epoch_us", actualValue, 0ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeEpochSDefaultValue_142()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEpochSWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute EPOCH_S Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("epoch_s", actualValue, 0UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeEpochSMaxValue_143()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id epochSArgument;
        epochSArgument = [NSNumber numberWithUnsignedInt:4294967295UL];
        [cluster writeAttributeEpochSWithValue:epochSArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute EPOCH_S Max Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeEpochSMaxValue_144()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEpochSWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute EPOCH_S Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("epoch_s", actualValue, 4294967295UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeEpochSMinValue_145()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id epochSArgument;
        epochSArgument = [NSNumber numberWithUnsignedInt:0UL];
        [cluster writeAttributeEpochSWithValue:epochSArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute EPOCH_S Min Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeEpochSMinValue_146()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEpochSWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute EPOCH_S Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("epoch_s", actualValue, 0UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeUnsupported_147()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeUnsupportedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute UNSUPPORTED Error: %@", err);

            if (err.code == MTRInteractionErrorCodeUnsupportedAttribute) {
                NextTest();
                return;
            }

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("unsupported", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteattributeUnsupported_148()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id unsupportedArgument;
        unsupportedArgument = [NSNumber numberWithBool:0];
        [cluster writeAttributeUnsupportedWithValue:unsupportedArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Writeattribute UNSUPPORTED Error: %@", err);

                                             if (err.code == MTRInteractionErrorCodeUnsupportedAttribute) {
                                                 NextTest();
                                                 return;
                                             }

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestCommandToUnsupportedEndpoint_149()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(200) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster testWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Send Test Command to unsupported endpoint Error: %@", err);

            VerifyOrReturn(CheckValue("status",
                err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE) : 0,
                EMBER_ZCL_STATUS_UNSUPPORTED_ENDPOINT));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestCommandToUnsupportedCluster_150()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster testWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Send Test Command to unsupported cluster Error: %@", err);

            VerifyOrReturn(CheckValue("status",
                err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE) : 0,
                EMBER_ZCL_STATUS_UNSUPPORTED_CLUSTER));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeVendorIdDefaultValue_151()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeVendorIdWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute vendor_id Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("vendor_id", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeVendorId_152()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id vendorIdArgument;
        vendorIdArgument = [NSNumber numberWithUnsignedShort:17U];
        [cluster writeAttributeVendorIdWithValue:vendorIdArgument
                                      completion:^(NSError * _Nullable err) {
                                          NSLog(@"Write attribute vendor_id Error: %@", err);

                                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                          NextTest();
                                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeVendorId_153()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeVendorIdWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute vendor_id Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("vendor_id", actualValue, 17U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRestoreAttributeVendorId_154()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id vendorIdArgument;
        vendorIdArgument = [NSNumber numberWithUnsignedShort:0U];
        [cluster writeAttributeVendorIdWithValue:vendorIdArgument
                                      completion:^(NSError * _Nullable err) {
                                          NSLog(@"Restore attribute vendor_id Error: %@", err);

                                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                          NextTest();
                                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendACommandWithAVendorIdAndEnum_155()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestEnumsRequestParams alloc] init];
        params.arg1 = [NSNumber numberWithUnsignedShort:20003U];
        params.arg2 = [NSNumber numberWithUnsignedChar:1U];
        [cluster
            testEnumsRequestWithParams:params
                            completion:^(MTRUnitTestingClusterTestEnumsResponseParams * _Nullable values, NSError * _Nullable err) {
                                NSLog(@"Send a command with a vendor_id and enum Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                {
                                    id actualValue = values.arg1;
                                    VerifyOrReturn(CheckValue("arg1", actualValue, 20003U));
                                }

                                {
                                    id actualValue = values.arg2;
                                    VerifyOrReturn(CheckValue("arg2", actualValue, 1U));
                                }

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendACommandWithAVendorIdAndInvalidEnum_156()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestEnumsRequestParams alloc] init];
        params.arg1 = [NSNumber numberWithUnsignedShort:20003U];
        params.arg2 = [NSNumber numberWithUnsignedChar:101U];
        [cluster
            testEnumsRequestWithParams:params
                            completion:^(MTRUnitTestingClusterTestEnumsResponseParams * _Nullable values, NSError * _Nullable err) {
                                NSLog(@"Send a command with a vendor_id and invalid enum Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                {
                                    id actualValue = values.arg1;
                                    VerifyOrReturn(CheckValue("arg1", actualValue, 20003U));
                                }

                                {
                                    id actualValue = values.arg2;
                                    VerifyOrReturn(CheckValue("arg2", actualValue, 4U));
                                }

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestCommandWithStructArgumentAndArg1bIsTrue_157()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestStructArgumentRequestParams alloc] init];
        params.arg1 = [[MTRUnitTestingClusterSimpleStruct alloc] init];
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).a = [NSNumber numberWithUnsignedChar:0U];
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).b = [NSNumber numberWithBool:true];
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).c = [NSNumber numberWithUnsignedChar:2U];
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).d = [[NSData alloc] initWithBytes:"octet_string" length:12];
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).e = @"char_string";
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).f = [NSNumber numberWithUnsignedChar:1U];
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).g = [NSNumber numberWithFloat:0.0f];
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).h = [NSNumber numberWithDouble:0];

        [cluster testStructArgumentRequestWithParams:params
                                          completion:^(MTRUnitTestingClusterBooleanResponseParams * _Nullable values,
                                              NSError * _Nullable err) {
                                              NSLog(@"Send Test Command With Struct Argument and arg1.b is true Error: %@", err);

                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                              {
                                                  id actualValue = values.value;
                                                  VerifyOrReturn(CheckValue("value", actualValue, true));
                                              }

                                              NextTest();
                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestCommandWithStructArgumentAndArg1bIsFalse_158()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestStructArgumentRequestParams alloc] init];
        params.arg1 = [[MTRUnitTestingClusterSimpleStruct alloc] init];
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).a = [NSNumber numberWithUnsignedChar:0U];
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).b = [NSNumber numberWithBool:false];
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).c = [NSNumber numberWithUnsignedChar:2U];
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).d = [[NSData alloc] initWithBytes:"octet_string" length:12];
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).e = @"char_string";
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).f = [NSNumber numberWithUnsignedChar:1U];
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).g = [NSNumber numberWithFloat:0.0f];
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).h = [NSNumber numberWithDouble:0];

        [cluster testStructArgumentRequestWithParams:params
                                          completion:^(MTRUnitTestingClusterBooleanResponseParams * _Nullable values,
                                              NSError * _Nullable err) {
                                              NSLog(@"Send Test Command With Struct Argument and arg1.b is false Error: %@", err);

                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                              {
                                                  id actualValue = values.value;
                                                  VerifyOrReturn(CheckValue("value", actualValue, false));
                                              }

                                              NextTest();
                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestCommandWithNestedStructArgumentAndArg1cbIsTrue_159()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestNestedStructArgumentRequestParams alloc] init];
        params.arg1 = [[MTRUnitTestingClusterNestedStruct alloc] init];
        ((MTRUnitTestingClusterNestedStruct *) params.arg1).a = [NSNumber numberWithUnsignedChar:0U];
        ((MTRUnitTestingClusterNestedStruct *) params.arg1).b = [NSNumber numberWithBool:true];
        ((MTRUnitTestingClusterNestedStruct *) params.arg1).c = [[MTRUnitTestingClusterSimpleStruct alloc] init];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStruct *) params.arg1).c).a =
            [NSNumber numberWithUnsignedChar:0U];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStruct *) params.arg1).c).b =
            [NSNumber numberWithBool:true];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStruct *) params.arg1).c).c =
            [NSNumber numberWithUnsignedChar:2U];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStruct *) params.arg1).c).d =
            [[NSData alloc] initWithBytes:"octet_string" length:12];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStruct *) params.arg1).c).e = @"char_string";
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStruct *) params.arg1).c).f =
            [NSNumber numberWithUnsignedChar:1U];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStruct *) params.arg1).c).g =
            [NSNumber numberWithFloat:0.0f];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStruct *) params.arg1).c).h =
            [NSNumber numberWithDouble:0];

        [cluster
            testNestedStructArgumentRequestWithParams:params
                                           completion:^(MTRUnitTestingClusterBooleanResponseParams * _Nullable values,
                                               NSError * _Nullable err) {
                                               NSLog(
                                                   @"Send Test Command With Nested Struct Argument and arg1.c.b is true Error: %@",
                                                   err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               {
                                                   id actualValue = values.value;
                                                   VerifyOrReturn(CheckValue("value", actualValue, true));
                                               }

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestCommandWithNestedStructArgumentArg1cbIsFalse_160()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestNestedStructArgumentRequestParams alloc] init];
        params.arg1 = [[MTRUnitTestingClusterNestedStruct alloc] init];
        ((MTRUnitTestingClusterNestedStruct *) params.arg1).a = [NSNumber numberWithUnsignedChar:0U];
        ((MTRUnitTestingClusterNestedStruct *) params.arg1).b = [NSNumber numberWithBool:true];
        ((MTRUnitTestingClusterNestedStruct *) params.arg1).c = [[MTRUnitTestingClusterSimpleStruct alloc] init];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStruct *) params.arg1).c).a =
            [NSNumber numberWithUnsignedChar:0U];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStruct *) params.arg1).c).b =
            [NSNumber numberWithBool:false];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStruct *) params.arg1).c).c =
            [NSNumber numberWithUnsignedChar:2U];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStruct *) params.arg1).c).d =
            [[NSData alloc] initWithBytes:"octet_string" length:12];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStruct *) params.arg1).c).e = @"char_string";
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStruct *) params.arg1).c).f =
            [NSNumber numberWithUnsignedChar:1U];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStruct *) params.arg1).c).g =
            [NSNumber numberWithFloat:0.0f];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStruct *) params.arg1).c).h =
            [NSNumber numberWithDouble:0];

        [cluster
            testNestedStructArgumentRequestWithParams:params
                                           completion:^(MTRUnitTestingClusterBooleanResponseParams * _Nullable values,
                                               NSError * _Nullable err) {
                                               NSLog(@"Send Test Command With Nested Struct Argument arg1.c.b is false Error: %@",
                                                   err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               {
                                                   id actualValue = values.value;
                                                   VerifyOrReturn(CheckValue("value", actualValue, false));
                                               }

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestCommandWithNestedStructListArgumentAndAllFieldsBOfArg1dAreTrue_161()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestNestedStructListArgumentRequestParams alloc] init];
        params.arg1 = [[MTRUnitTestingClusterNestedStructList alloc] init];
        ((MTRUnitTestingClusterNestedStructList *) params.arg1).a = [NSNumber numberWithUnsignedChar:0U];
        ((MTRUnitTestingClusterNestedStructList *) params.arg1).b = [NSNumber numberWithBool:true];
        ((MTRUnitTestingClusterNestedStructList *) params.arg1).c = [[MTRUnitTestingClusterSimpleStruct alloc] init];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) params.arg1).c).a =
            [NSNumber numberWithUnsignedChar:0U];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) params.arg1).c).b =
            [NSNumber numberWithBool:true];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) params.arg1).c).c =
            [NSNumber numberWithUnsignedChar:2U];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) params.arg1).c).d =
            [[NSData alloc] initWithBytes:"octet_string" length:12];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) params.arg1).c).e = @"char_string";
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) params.arg1).c).f =
            [NSNumber numberWithUnsignedChar:1U];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) params.arg1).c).g =
            [NSNumber numberWithFloat:0.0f];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) params.arg1).c).h =
            [NSNumber numberWithDouble:0];

        {
            NSMutableArray * temp_1 = [[NSMutableArray alloc] init];
            temp_1[0] = [[MTRUnitTestingClusterSimpleStruct alloc] init];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[0]).a = [NSNumber numberWithUnsignedChar:1U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[0]).b = [NSNumber numberWithBool:true];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[0]).c = [NSNumber numberWithUnsignedChar:3U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[0]).d = [[NSData alloc] initWithBytes:"nested_octet_string" length:19];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[0]).e = @"nested_char_string";
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[0]).f = [NSNumber numberWithUnsignedChar:1U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[0]).g = [NSNumber numberWithFloat:0.0f];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[0]).h = [NSNumber numberWithDouble:0];

            temp_1[1] = [[MTRUnitTestingClusterSimpleStruct alloc] init];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[1]).a = [NSNumber numberWithUnsignedChar:2U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[1]).b = [NSNumber numberWithBool:true];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[1]).c = [NSNumber numberWithUnsignedChar:3U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[1]).d = [[NSData alloc] initWithBytes:"nested_octet_string" length:19];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[1]).e = @"nested_char_string";
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[1]).f = [NSNumber numberWithUnsignedChar:1U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[1]).g = [NSNumber numberWithFloat:0.0f];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[1]).h = [NSNumber numberWithDouble:0];

            ((MTRUnitTestingClusterNestedStructList *) params.arg1).d = temp_1;
        }
        {
            NSMutableArray * temp_1 = [[NSMutableArray alloc] init];
            temp_1[0] = [NSNumber numberWithUnsignedInt:1UL];
            temp_1[1] = [NSNumber numberWithUnsignedInt:2UL];
            temp_1[2] = [NSNumber numberWithUnsignedInt:3UL];
            ((MTRUnitTestingClusterNestedStructList *) params.arg1).e = temp_1;
        }
        {
            NSMutableArray * temp_1 = [[NSMutableArray alloc] init];
            temp_1[0] = [[NSData alloc] initWithBytes:"octet_string_1" length:14];
            temp_1[1] = [[NSData alloc] initWithBytes:"octect_string_2" length:15];
            temp_1[2] = [[NSData alloc] initWithBytes:"octet_string_3" length:14];
            ((MTRUnitTestingClusterNestedStructList *) params.arg1).f = temp_1;
        }
        {
            NSMutableArray * temp_1 = [[NSMutableArray alloc] init];
            temp_1[0] = [NSNumber numberWithUnsignedChar:0U];
            temp_1[1] = [NSNumber numberWithUnsignedChar:255U];
            ((MTRUnitTestingClusterNestedStructList *) params.arg1).g = temp_1;
        }

        [cluster testNestedStructListArgumentRequestWithParams:params
                                                    completion:^(MTRUnitTestingClusterBooleanResponseParams * _Nullable values,
                                                        NSError * _Nullable err) {
                                                        NSLog(@"Send Test Command With Nested Struct List Argument and all fields "
                                                              @"b of arg1.d are true Error: %@",
                                                            err);

                                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                        {
                                                            id actualValue = values.value;
                                                            VerifyOrReturn(CheckValue("value", actualValue, true));
                                                        }

                                                        NextTest();
                                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestCommandWithNestedStructListArgumentAndSomeFieldsBOfArg1dAreFalse_162()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestNestedStructListArgumentRequestParams alloc] init];
        params.arg1 = [[MTRUnitTestingClusterNestedStructList alloc] init];
        ((MTRUnitTestingClusterNestedStructList *) params.arg1).a = [NSNumber numberWithUnsignedChar:0U];
        ((MTRUnitTestingClusterNestedStructList *) params.arg1).b = [NSNumber numberWithBool:true];
        ((MTRUnitTestingClusterNestedStructList *) params.arg1).c = [[MTRUnitTestingClusterSimpleStruct alloc] init];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) params.arg1).c).a =
            [NSNumber numberWithUnsignedChar:0U];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) params.arg1).c).b =
            [NSNumber numberWithBool:true];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) params.arg1).c).c =
            [NSNumber numberWithUnsignedChar:2U];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) params.arg1).c).d =
            [[NSData alloc] initWithBytes:"octet_string" length:12];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) params.arg1).c).e = @"char_string";
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) params.arg1).c).f =
            [NSNumber numberWithUnsignedChar:1U];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) params.arg1).c).g =
            [NSNumber numberWithFloat:0.0f];
        ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) params.arg1).c).h =
            [NSNumber numberWithDouble:0];

        {
            NSMutableArray * temp_1 = [[NSMutableArray alloc] init];
            temp_1[0] = [[MTRUnitTestingClusterSimpleStruct alloc] init];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[0]).a = [NSNumber numberWithUnsignedChar:1U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[0]).b = [NSNumber numberWithBool:true];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[0]).c = [NSNumber numberWithUnsignedChar:3U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[0]).d = [[NSData alloc] initWithBytes:"nested_octet_string" length:19];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[0]).e = @"nested_char_string";
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[0]).f = [NSNumber numberWithUnsignedChar:1U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[0]).g = [NSNumber numberWithFloat:0.0f];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[0]).h = [NSNumber numberWithDouble:0];

            temp_1[1] = [[MTRUnitTestingClusterSimpleStruct alloc] init];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[1]).a = [NSNumber numberWithUnsignedChar:2U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[1]).b = [NSNumber numberWithBool:false];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[1]).c = [NSNumber numberWithUnsignedChar:3U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[1]).d = [[NSData alloc] initWithBytes:"nested_octet_string" length:19];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[1]).e = @"nested_char_string";
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[1]).f = [NSNumber numberWithUnsignedChar:1U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[1]).g = [NSNumber numberWithFloat:0.0f];
            ((MTRUnitTestingClusterSimpleStruct *) temp_1[1]).h = [NSNumber numberWithDouble:0];

            ((MTRUnitTestingClusterNestedStructList *) params.arg1).d = temp_1;
        }
        {
            NSMutableArray * temp_1 = [[NSMutableArray alloc] init];
            temp_1[0] = [NSNumber numberWithUnsignedInt:1UL];
            temp_1[1] = [NSNumber numberWithUnsignedInt:2UL];
            temp_1[2] = [NSNumber numberWithUnsignedInt:3UL];
            ((MTRUnitTestingClusterNestedStructList *) params.arg1).e = temp_1;
        }
        {
            NSMutableArray * temp_1 = [[NSMutableArray alloc] init];
            temp_1[0] = [[NSData alloc] initWithBytes:"octet_string_1" length:14];
            temp_1[1] = [[NSData alloc] initWithBytes:"octect_string_2" length:15];
            temp_1[2] = [[NSData alloc] initWithBytes:"octet_string_3" length:14];
            ((MTRUnitTestingClusterNestedStructList *) params.arg1).f = temp_1;
        }
        {
            NSMutableArray * temp_1 = [[NSMutableArray alloc] init];
            temp_1[0] = [NSNumber numberWithUnsignedChar:0U];
            temp_1[1] = [NSNumber numberWithUnsignedChar:255U];
            ((MTRUnitTestingClusterNestedStructList *) params.arg1).g = temp_1;
        }

        [cluster testNestedStructListArgumentRequestWithParams:params
                                                    completion:^(MTRUnitTestingClusterBooleanResponseParams * _Nullable values,
                                                        NSError * _Nullable err) {
                                                        NSLog(@"Send Test Command With Nested Struct List Argument and some fields "
                                                              @"b of arg1.d are false Error: %@",
                                                            err);

                                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                        {
                                                            id actualValue = values.value;
                                                            VerifyOrReturn(CheckValue("value", actualValue, false));
                                                        }

                                                        NextTest();
                                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestCommandWithStructArgumentAndSeeWhatWeGetBack_163()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterSimpleStructEchoRequestParams alloc] init];
        params.arg1 = [[MTRUnitTestingClusterSimpleStruct alloc] init];
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).a = [NSNumber numberWithUnsignedChar:17U];
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).b = [NSNumber numberWithBool:false];
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).c = [NSNumber numberWithUnsignedChar:2U];
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).d = [[NSData alloc] initWithBytes:"octet_string" length:12];
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).e = @"char_string";
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).f = [NSNumber numberWithUnsignedChar:1U];
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).g = [NSNumber numberWithFloat:0.1f];
        ((MTRUnitTestingClusterSimpleStruct *) params.arg1).h = [NSNumber numberWithDouble:0.1];

        [cluster
            simpleStructEchoRequestWithParams:params
                                   completion:^(MTRUnitTestingClusterSimpleStructResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Send Test Command With Struct Argument and see what we get back Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.arg1;
                                           VerifyOrReturn(
                                               CheckValue("a", ((MTRUnitTestingClusterSimpleStruct *) actualValue).a, 17U));
                                           VerifyOrReturn(
                                               CheckValue("b", ((MTRUnitTestingClusterSimpleStruct *) actualValue).b, false));
                                           VerifyOrReturn(
                                               CheckValue("c", ((MTRUnitTestingClusterSimpleStruct *) actualValue).c, 2U));
                                           VerifyOrReturn(
                                               CheckValueAsString("d", ((MTRUnitTestingClusterSimpleStruct *) actualValue).d,
                                                   [[NSData alloc] initWithBytes:"octet_string" length:12]));
                                           VerifyOrReturn(CheckValueAsString(
                                               "e", ((MTRUnitTestingClusterSimpleStruct *) actualValue).e, @"char_string"));
                                           VerifyOrReturn(
                                               CheckValue("f", ((MTRUnitTestingClusterSimpleStruct *) actualValue).f, 1U));
                                           VerifyOrReturn(
                                               CheckValue("g", ((MTRUnitTestingClusterSimpleStruct *) actualValue).g, 0.1f));
                                           VerifyOrReturn(
                                               CheckValue("h", ((MTRUnitTestingClusterSimpleStruct *) actualValue).h, 0.1));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestCommandWithListOfInt8uAndNoneOfThemIsSetTo0_164()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestListInt8UArgumentRequestParams alloc] init];
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [NSNumber numberWithUnsignedChar:1U];
            temp_0[1] = [NSNumber numberWithUnsignedChar:2U];
            temp_0[2] = [NSNumber numberWithUnsignedChar:3U];
            temp_0[3] = [NSNumber numberWithUnsignedChar:4U];
            temp_0[4] = [NSNumber numberWithUnsignedChar:5U];
            temp_0[5] = [NSNumber numberWithUnsignedChar:6U];
            temp_0[6] = [NSNumber numberWithUnsignedChar:7U];
            temp_0[7] = [NSNumber numberWithUnsignedChar:8U];
            temp_0[8] = [NSNumber numberWithUnsignedChar:9U];
            params.arg1 = temp_0;
        }
        [cluster
            testListInt8UArgumentRequestWithParams:params
                                        completion:^(MTRUnitTestingClusterBooleanResponseParams * _Nullable values,
                                            NSError * _Nullable err) {
                                            NSLog(@"Send Test Command With List of INT8U and none of them is set to 0 Error: %@",
                                                err);

                                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                            {
                                                id actualValue = values.value;
                                                VerifyOrReturn(CheckValue("value", actualValue, true));
                                            }

                                            NextTest();
                                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestCommandWithListOfInt8uAndOneOfThemIsSetTo0_165()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestListInt8UArgumentRequestParams alloc] init];
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [NSNumber numberWithUnsignedChar:1U];
            temp_0[1] = [NSNumber numberWithUnsignedChar:2U];
            temp_0[2] = [NSNumber numberWithUnsignedChar:3U];
            temp_0[3] = [NSNumber numberWithUnsignedChar:4U];
            temp_0[4] = [NSNumber numberWithUnsignedChar:5U];
            temp_0[5] = [NSNumber numberWithUnsignedChar:6U];
            temp_0[6] = [NSNumber numberWithUnsignedChar:7U];
            temp_0[7] = [NSNumber numberWithUnsignedChar:8U];
            temp_0[8] = [NSNumber numberWithUnsignedChar:9U];
            temp_0[9] = [NSNumber numberWithUnsignedChar:0U];
            params.arg1 = temp_0;
        }
        [cluster
            testListInt8UArgumentRequestWithParams:params
                                        completion:^(MTRUnitTestingClusterBooleanResponseParams * _Nullable values,
                                            NSError * _Nullable err) {
                                            NSLog(
                                                @"Send Test Command With List of INT8U and one of them is set to 0 Error: %@", err);

                                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                            {
                                                id actualValue = values.value;
                                                VerifyOrReturn(CheckValue("value", actualValue, false));
                                            }

                                            NextTest();
                                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestCommandWithListOfInt8uAndGetItReversed_166()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestListInt8UReverseRequestParams alloc] init];
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [NSNumber numberWithUnsignedChar:1U];
            temp_0[1] = [NSNumber numberWithUnsignedChar:2U];
            temp_0[2] = [NSNumber numberWithUnsignedChar:3U];
            temp_0[3] = [NSNumber numberWithUnsignedChar:4U];
            temp_0[4] = [NSNumber numberWithUnsignedChar:5U];
            temp_0[5] = [NSNumber numberWithUnsignedChar:6U];
            temp_0[6] = [NSNumber numberWithUnsignedChar:7U];
            temp_0[7] = [NSNumber numberWithUnsignedChar:8U];
            temp_0[8] = [NSNumber numberWithUnsignedChar:9U];
            params.arg1 = temp_0;
        }
        [cluster
            testListInt8UReverseRequestWithParams:params
                                       completion:^(MTRUnitTestingClusterTestListInt8UReverseResponseParams * _Nullable values,
                                           NSError * _Nullable err) {
                                           NSLog(@"Send Test Command With List of INT8U and get it reversed Error: %@", err);

                                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                           {
                                               id actualValue = values.arg1;
                                               VerifyOrReturn(CheckValue("arg1", [actualValue count], static_cast<uint32_t>(9)));
                                               VerifyOrReturn(CheckValue("", actualValue[0], 9U));
                                               VerifyOrReturn(CheckValue("", actualValue[1], 8U));
                                               VerifyOrReturn(CheckValue("", actualValue[2], 7U));
                                               VerifyOrReturn(CheckValue("", actualValue[3], 6U));
                                               VerifyOrReturn(CheckValue("", actualValue[4], 5U));
                                               VerifyOrReturn(CheckValue("", actualValue[5], 4U));
                                               VerifyOrReturn(CheckValue("", actualValue[6], 3U));
                                               VerifyOrReturn(CheckValue("", actualValue[7], 2U));
                                               VerifyOrReturn(CheckValue("", actualValue[8], 1U));
                                           }

                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestCommandWithEmptyListOfInt8uAndGetAnEmptyListBack_167()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestListInt8UReverseRequestParams alloc] init];
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            params.arg1 = temp_0;
        }
        [cluster
            testListInt8UReverseRequestWithParams:params
                                       completion:^(MTRUnitTestingClusterTestListInt8UReverseResponseParams * _Nullable values,
                                           NSError * _Nullable err) {
                                           NSLog(@"Send Test Command With empty List of INT8U and get an empty list back Error: %@",
                                               err);

                                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                           {
                                               id actualValue = values.arg1;
                                               VerifyOrReturn(CheckValue("arg1", [actualValue count], static_cast<uint32_t>(0)));
                                           }

                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestCommandWithListOfStructArgumentAndArg1bOfFirstItemIsTrue_168()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestListStructArgumentRequestParams alloc] init];
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRUnitTestingClusterSimpleStruct alloc] init];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[0]).a = [NSNumber numberWithUnsignedChar:0U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[0]).b = [NSNumber numberWithBool:true];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[0]).c = [NSNumber numberWithUnsignedChar:2U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[0]).d = [[NSData alloc] initWithBytes:"first_octet_string" length:18];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[0]).e = @"first_char_string";
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[0]).f = [NSNumber numberWithUnsignedChar:1U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[0]).g = [NSNumber numberWithFloat:0.0f];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[0]).h = [NSNumber numberWithDouble:0];

            temp_0[1] = [[MTRUnitTestingClusterSimpleStruct alloc] init];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[1]).a = [NSNumber numberWithUnsignedChar:1U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[1]).b = [NSNumber numberWithBool:true];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[1]).c = [NSNumber numberWithUnsignedChar:3U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[1]).d = [[NSData alloc] initWithBytes:"second_octet_string" length:19];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[1]).e = @"second_char_string";
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[1]).f = [NSNumber numberWithUnsignedChar:1U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[1]).g = [NSNumber numberWithFloat:0.0f];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[1]).h = [NSNumber numberWithDouble:0];

            params.arg1 = temp_0;
        }
        [cluster testListStructArgumentRequestWithParams:params
                                              completion:^(MTRUnitTestingClusterBooleanResponseParams * _Nullable values,
                                                  NSError * _Nullable err) {
                                                  NSLog(@"Send Test Command With List of Struct Argument and arg1.b of first item "
                                                        @"is true Error: %@",
                                                      err);

                                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                  {
                                                      id actualValue = values.value;
                                                      VerifyOrReturn(CheckValue("value", actualValue, true));
                                                  }

                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestCommandWithListOfStructArgumentAndArg1bOfFirstItemIsFalse_169()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestListStructArgumentRequestParams alloc] init];
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRUnitTestingClusterSimpleStruct alloc] init];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[0]).a = [NSNumber numberWithUnsignedChar:1U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[0]).b = [NSNumber numberWithBool:true];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[0]).c = [NSNumber numberWithUnsignedChar:3U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[0]).d = [[NSData alloc] initWithBytes:"second_octet_string" length:19];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[0]).e = @"second_char_string";
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[0]).f = [NSNumber numberWithUnsignedChar:1U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[0]).g = [NSNumber numberWithFloat:0.0f];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[0]).h = [NSNumber numberWithDouble:0];

            temp_0[1] = [[MTRUnitTestingClusterSimpleStruct alloc] init];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[1]).a = [NSNumber numberWithUnsignedChar:0U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[1]).b = [NSNumber numberWithBool:false];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[1]).c = [NSNumber numberWithUnsignedChar:2U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[1]).d = [[NSData alloc] initWithBytes:"first_octet_string" length:18];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[1]).e = @"first_char_string";
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[1]).f = [NSNumber numberWithUnsignedChar:1U];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[1]).g = [NSNumber numberWithFloat:0.0f];
            ((MTRUnitTestingClusterSimpleStruct *) temp_0[1]).h = [NSNumber numberWithDouble:0];

            params.arg1 = temp_0;
        }
        [cluster testListStructArgumentRequestWithParams:params
                                              completion:^(MTRUnitTestingClusterBooleanResponseParams * _Nullable values,
                                                  NSError * _Nullable err) {
                                                  NSLog(@"Send Test Command With List of Struct Argument and arg1.b of first item "
                                                        @"is false Error: %@",
                                                      err);

                                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                  {
                                                      id actualValue = values.value;
                                                      VerifyOrReturn(CheckValue("value", actualValue, false));
                                                  }

                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestCommandWithListOfNestedStructListArgumentAndAllFieldsBOfElementsOfArg1dAreTrue_170()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestListNestedStructListArgumentRequestParams alloc] init];
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRUnitTestingClusterNestedStructList alloc] init];
            ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).a = [NSNumber numberWithUnsignedChar:0U];
            ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).b = [NSNumber numberWithBool:true];
            ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).c = [[MTRUnitTestingClusterSimpleStruct alloc] init];
            ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).c).a =
                [NSNumber numberWithUnsignedChar:0U];
            ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).c).b =
                [NSNumber numberWithBool:true];
            ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).c).c =
                [NSNumber numberWithUnsignedChar:2U];
            ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).c).d =
                [[NSData alloc] initWithBytes:"octet_string" length:12];
            ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).c).e = @"char_string";
            ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).c).f =
                [NSNumber numberWithUnsignedChar:1U];
            ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).c).g =
                [NSNumber numberWithFloat:0.0f];
            ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).c).h =
                [NSNumber numberWithDouble:0];

            {
                NSMutableArray * temp_2 = [[NSMutableArray alloc] init];
                temp_2[0] = [[MTRUnitTestingClusterSimpleStruct alloc] init];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[0]).a = [NSNumber numberWithUnsignedChar:1U];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[0]).b = [NSNumber numberWithBool:true];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[0]).c = [NSNumber numberWithUnsignedChar:3U];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[0]).d = [[NSData alloc] initWithBytes:"nested_octet_string"
                                                                                             length:19];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[0]).e = @"nested_char_string";
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[0]).f = [NSNumber numberWithUnsignedChar:1U];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[0]).g = [NSNumber numberWithFloat:0.0f];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[0]).h = [NSNumber numberWithDouble:0];

                temp_2[1] = [[MTRUnitTestingClusterSimpleStruct alloc] init];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[1]).a = [NSNumber numberWithUnsignedChar:2U];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[1]).b = [NSNumber numberWithBool:true];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[1]).c = [NSNumber numberWithUnsignedChar:3U];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[1]).d = [[NSData alloc] initWithBytes:"nested_octet_string"
                                                                                             length:19];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[1]).e = @"nested_char_string";
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[1]).f = [NSNumber numberWithUnsignedChar:1U];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[1]).g = [NSNumber numberWithFloat:0.0f];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[1]).h = [NSNumber numberWithDouble:0];

                ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).d = temp_2;
            }
            {
                NSMutableArray * temp_2 = [[NSMutableArray alloc] init];
                temp_2[0] = [NSNumber numberWithUnsignedInt:1UL];
                temp_2[1] = [NSNumber numberWithUnsignedInt:2UL];
                temp_2[2] = [NSNumber numberWithUnsignedInt:3UL];
                ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).e = temp_2;
            }
            {
                NSMutableArray * temp_2 = [[NSMutableArray alloc] init];
                temp_2[0] = [[NSData alloc] initWithBytes:"octet_string_1" length:14];
                temp_2[1] = [[NSData alloc] initWithBytes:"octect_string_2" length:15];
                temp_2[2] = [[NSData alloc] initWithBytes:"octet_string_3" length:14];
                ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).f = temp_2;
            }
            {
                NSMutableArray * temp_2 = [[NSMutableArray alloc] init];
                temp_2[0] = [NSNumber numberWithUnsignedChar:0U];
                temp_2[1] = [NSNumber numberWithUnsignedChar:255U];
                ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).g = temp_2;
            }

            params.arg1 = temp_0;
        }
        [cluster testListNestedStructListArgumentRequestWithParams:params
                                                        completion:^(MTRUnitTestingClusterBooleanResponseParams * _Nullable values,
                                                            NSError * _Nullable err) {
                                                            NSLog(@"Send Test Command With List of Nested Struct List Argument and "
                                                                  @"all fields b of elements of arg1.d are true Error: %@",
                                                                err);

                                                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                            {
                                                                id actualValue = values.value;
                                                                VerifyOrReturn(CheckValue("value", actualValue, true));
                                                            }

                                                            NextTest();
                                                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestCommandWithNestedStructListArgumentAndSomeFieldsBOfElementsOfArg1dAreFalse_171()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestListNestedStructListArgumentRequestParams alloc] init];
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRUnitTestingClusterNestedStructList alloc] init];
            ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).a = [NSNumber numberWithUnsignedChar:0U];
            ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).b = [NSNumber numberWithBool:true];
            ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).c = [[MTRUnitTestingClusterSimpleStruct alloc] init];
            ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).c).a =
                [NSNumber numberWithUnsignedChar:0U];
            ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).c).b =
                [NSNumber numberWithBool:true];
            ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).c).c =
                [NSNumber numberWithUnsignedChar:2U];
            ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).c).d =
                [[NSData alloc] initWithBytes:"octet_string" length:12];
            ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).c).e = @"char_string";
            ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).c).f =
                [NSNumber numberWithUnsignedChar:1U];
            ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).c).g =
                [NSNumber numberWithFloat:0.0f];
            ((MTRUnitTestingClusterSimpleStruct *) ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).c).h =
                [NSNumber numberWithDouble:0];

            {
                NSMutableArray * temp_2 = [[NSMutableArray alloc] init];
                temp_2[0] = [[MTRUnitTestingClusterSimpleStruct alloc] init];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[0]).a = [NSNumber numberWithUnsignedChar:1U];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[0]).b = [NSNumber numberWithBool:true];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[0]).c = [NSNumber numberWithUnsignedChar:3U];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[0]).d = [[NSData alloc] initWithBytes:"nested_octet_string"
                                                                                             length:19];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[0]).e = @"nested_char_string";
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[0]).f = [NSNumber numberWithUnsignedChar:1U];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[0]).g = [NSNumber numberWithFloat:0.0f];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[0]).h = [NSNumber numberWithDouble:0];

                temp_2[1] = [[MTRUnitTestingClusterSimpleStruct alloc] init];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[1]).a = [NSNumber numberWithUnsignedChar:2U];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[1]).b = [NSNumber numberWithBool:false];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[1]).c = [NSNumber numberWithUnsignedChar:3U];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[1]).d = [[NSData alloc] initWithBytes:"nested_octet_string"
                                                                                             length:19];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[1]).e = @"nested_char_string";
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[1]).f = [NSNumber numberWithUnsignedChar:1U];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[1]).g = [NSNumber numberWithFloat:0.0f];
                ((MTRUnitTestingClusterSimpleStruct *) temp_2[1]).h = [NSNumber numberWithDouble:0];

                ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).d = temp_2;
            }
            {
                NSMutableArray * temp_2 = [[NSMutableArray alloc] init];
                temp_2[0] = [NSNumber numberWithUnsignedInt:1UL];
                temp_2[1] = [NSNumber numberWithUnsignedInt:2UL];
                temp_2[2] = [NSNumber numberWithUnsignedInt:3UL];
                ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).e = temp_2;
            }
            {
                NSMutableArray * temp_2 = [[NSMutableArray alloc] init];
                temp_2[0] = [[NSData alloc] initWithBytes:"octet_string_1" length:14];
                temp_2[1] = [[NSData alloc] initWithBytes:"octect_string_2" length:15];
                temp_2[2] = [[NSData alloc] initWithBytes:"octet_string_3" length:14];
                ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).f = temp_2;
            }
            {
                NSMutableArray * temp_2 = [[NSMutableArray alloc] init];
                temp_2[0] = [NSNumber numberWithUnsignedChar:0U];
                temp_2[1] = [NSNumber numberWithUnsignedChar:255U];
                ((MTRUnitTestingClusterNestedStructList *) temp_0[0]).g = temp_2;
            }

            params.arg1 = temp_0;
        }
        [cluster testListNestedStructListArgumentRequestWithParams:params
                                                        completion:^(MTRUnitTestingClusterBooleanResponseParams * _Nullable values,
                                                            NSError * _Nullable err) {
                                                            NSLog(@"Send Test Command With Nested Struct List Argument and some "
                                                                  @"fields b of elements of arg1.d are false Error: %@",
                                                                err);

                                                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                            {
                                                                id actualValue = values.value;
                                                                VerifyOrReturn(CheckValue("value", actualValue, false));
                                                            }

                                                            NextTest();
                                                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeListWithListOfInt8uAndNoneOfThemIsSetTo0_172()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id listInt8uArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [NSNumber numberWithUnsignedChar:1U];
            temp_0[1] = [NSNumber numberWithUnsignedChar:2U];
            temp_0[2] = [NSNumber numberWithUnsignedChar:3U];
            temp_0[3] = [NSNumber numberWithUnsignedChar:4U];
            listInt8uArgument = temp_0;
        }
        [cluster
            writeAttributeListInt8uWithValue:listInt8uArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"Write attribute LIST With List of INT8U and none of them is set to 0 Error: %@", err);

                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeListWithListOfInt8u_173()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeListInt8uWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute LIST With List of INT8U Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("list_int8u", [actualValue count], static_cast<uint32_t>(4)));
                VerifyOrReturn(CheckValue("", actualValue[0], 1U));
                VerifyOrReturn(CheckValue("", actualValue[1], 2U));
                VerifyOrReturn(CheckValue("", actualValue[2], 3U));
                VerifyOrReturn(CheckValue("", actualValue[3], 4U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeListWithListOfOctetString_174()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id listOctetStringArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[NSData alloc] initWithBytes:"Test0" length:5];
            temp_0[1] = [[NSData alloc] initWithBytes:"Test1" length:5];
            temp_0[2] = [[NSData alloc] initWithBytes:"Test2" length:5];
            temp_0[3] = [[NSData alloc] initWithBytes:"Test3" length:5];
            listOctetStringArgument = temp_0;
        }
        [cluster writeAttributeListOctetStringWithValue:listOctetStringArgument
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"Write attribute LIST With List of OCTET_STRING Error: %@", err);

                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeListWithListOfOctetString_175()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeListOctetStringWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute LIST With List of OCTET_STRING Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("list_octet_string", [actualValue count], static_cast<uint32_t>(4)));
                VerifyOrReturn(CheckValueAsString("", actualValue[0], [[NSData alloc] initWithBytes:"Test0" length:5]));
                VerifyOrReturn(CheckValueAsString("", actualValue[1], [[NSData alloc] initWithBytes:"Test1" length:5]));
                VerifyOrReturn(CheckValueAsString("", actualValue[2], [[NSData alloc] initWithBytes:"Test2" length:5]));
                VerifyOrReturn(CheckValueAsString("", actualValue[3], [[NSData alloc] initWithBytes:"Test3" length:5]));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeListWithListOfListStructOctetString_176()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id listStructOctetStringArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRUnitTestingClusterTestListStructOctet alloc] init];
            ((MTRUnitTestingClusterTestListStructOctet *) temp_0[0]).member1 = [NSNumber numberWithUnsignedLongLong:0ULL];
            ((MTRUnitTestingClusterTestListStructOctet *) temp_0[0]).member2 = [[NSData alloc] initWithBytes:"Test0" length:5];

            temp_0[1] = [[MTRUnitTestingClusterTestListStructOctet alloc] init];
            ((MTRUnitTestingClusterTestListStructOctet *) temp_0[1]).member1 = [NSNumber numberWithUnsignedLongLong:1ULL];
            ((MTRUnitTestingClusterTestListStructOctet *) temp_0[1]).member2 = [[NSData alloc] initWithBytes:"Test1" length:5];

            temp_0[2] = [[MTRUnitTestingClusterTestListStructOctet alloc] init];
            ((MTRUnitTestingClusterTestListStructOctet *) temp_0[2]).member1 = [NSNumber numberWithUnsignedLongLong:2ULL];
            ((MTRUnitTestingClusterTestListStructOctet *) temp_0[2]).member2 = [[NSData alloc] initWithBytes:"Test2" length:5];

            temp_0[3] = [[MTRUnitTestingClusterTestListStructOctet alloc] init];
            ((MTRUnitTestingClusterTestListStructOctet *) temp_0[3]).member1 = [NSNumber numberWithUnsignedLongLong:3ULL];
            ((MTRUnitTestingClusterTestListStructOctet *) temp_0[3]).member2 = [[NSData alloc] initWithBytes:"Test3" length:5];

            listStructOctetStringArgument = temp_0;
        }
        [cluster
            writeAttributeListStructOctetStringWithValue:listStructOctetStringArgument
                                              completion:^(NSError * _Nullable err) {
                                                  NSLog(
                                                      @"Write attribute LIST With List of LIST_STRUCT_OCTET_STRING Error: %@", err);

                                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeListWithListOfListStructOctetString_177()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeListStructOctetStringWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute LIST With List of LIST_STRUCT_OCTET_STRING Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("list_struct_octet_string", [actualValue count], static_cast<uint32_t>(4)));
                VerifyOrReturn(CheckValue("member1", ((MTRUnitTestingClusterTestListStructOctet *) actualValue[0]).member1, 0ULL));
                VerifyOrReturn(CheckValueAsString("member2", ((MTRUnitTestingClusterTestListStructOctet *) actualValue[0]).member2,
                    [[NSData alloc] initWithBytes:"Test0" length:5]));
                VerifyOrReturn(CheckValue("member1", ((MTRUnitTestingClusterTestListStructOctet *) actualValue[1]).member1, 1ULL));
                VerifyOrReturn(CheckValueAsString("member2", ((MTRUnitTestingClusterTestListStructOctet *) actualValue[1]).member2,
                    [[NSData alloc] initWithBytes:"Test1" length:5]));
                VerifyOrReturn(CheckValue("member1", ((MTRUnitTestingClusterTestListStructOctet *) actualValue[2]).member1, 2ULL));
                VerifyOrReturn(CheckValueAsString("member2", ((MTRUnitTestingClusterTestListStructOctet *) actualValue[2]).member2,
                    [[NSData alloc] initWithBytes:"Test2" length:5]));
                VerifyOrReturn(CheckValue("member1", ((MTRUnitTestingClusterTestListStructOctet *) actualValue[3]).member1, 3ULL));
                VerifyOrReturn(CheckValueAsString("member2", ((MTRUnitTestingClusterTestListStructOctet *) actualValue[3]).member2,
                    [[NSData alloc] initWithBytes:"Test3" length:5]));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestCommandWithOptionalArgSet_178()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestNullableOptionalRequestParams alloc] init];
        params.arg1 = [NSNumber numberWithUnsignedChar:5U];
        [cluster testNullableOptionalRequestWithParams:params
                                            completion:^(MTRUnitTestingClusterTestNullableOptionalResponseParams * _Nullable values,
                                                NSError * _Nullable err) {
                                                NSLog(@"Send Test Command with optional arg set. Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                {
                                                    id actualValue = values.wasPresent;
                                                    VerifyOrReturn(CheckValue("wasPresent", actualValue, true));
                                                }

                                                {
                                                    id actualValue = values.wasNull;
                                                    VerifyOrReturn(CheckValue("wasNull", actualValue, false));
                                                }

                                                {
                                                    id actualValue = values.value;
                                                    VerifyOrReturn(CheckValue("value", actualValue, 5U));
                                                }

                                                {
                                                    id actualValue = values.originalValue;
                                                    VerifyOrReturn(CheckValueNonNull("originalValue", actualValue));
                                                    VerifyOrReturn(CheckValue("originalValue", actualValue, 5U));
                                                }

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestCommandWithoutItsOptionalArg_179()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestNullableOptionalRequestParams alloc] init];
        [cluster testNullableOptionalRequestWithParams:params
                                            completion:^(MTRUnitTestingClusterTestNullableOptionalResponseParams * _Nullable values,
                                                NSError * _Nullable err) {
                                                NSLog(@"Send Test Command without its optional arg. Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                {
                                                    id actualValue = values.wasPresent;
                                                    VerifyOrReturn(CheckValue("wasPresent", actualValue, false));
                                                }

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadListOfStructsContainingNullablesAndOptionals_180()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeListNullablesAndOptionalsStructWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read list of structs containing nullables and optionals Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("list_nullables_and_optionals_struct", [actualValue count], static_cast<uint32_t>(1)));
                VerifyOrReturn(CheckValueNull(
                    "NullableInt", ((MTRUnitTestingClusterNullablesAndOptionalsStruct *) actualValue[0]).nullableInt));
                VerifyOrReturn(CheckValueNull(
                    "NullableString", ((MTRUnitTestingClusterNullablesAndOptionalsStruct *) actualValue[0]).nullableString));
                VerifyOrReturn(CheckValueNull(
                    "NullableStruct", ((MTRUnitTestingClusterNullablesAndOptionalsStruct *) actualValue[0]).nullableStruct));
                VerifyOrReturn(CheckValueNull(
                    "NullableList", ((MTRUnitTestingClusterNullablesAndOptionalsStruct *) actualValue[0]).nullableList));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteListOfStructsContainingNullablesAndOptionals_181()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id listNullablesAndOptionalsStructArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRUnitTestingClusterNullablesAndOptionalsStruct alloc] init];
            ((MTRUnitTestingClusterNullablesAndOptionalsStruct *) temp_0[0]).nullableInt = nil;
            ((MTRUnitTestingClusterNullablesAndOptionalsStruct *) temp_0[0]).nullableString = nil;
            ((MTRUnitTestingClusterNullablesAndOptionalsStruct *) temp_0[0]).nullableStruct = nil;
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedChar:1U];
                temp_3[1] = [NSNumber numberWithUnsignedChar:2U];
                ((MTRUnitTestingClusterNullablesAndOptionalsStruct *) temp_0[0]).nullableList = temp_3;
            }

            listNullablesAndOptionalsStructArgument = temp_0;
        }
        [cluster writeAttributeListNullablesAndOptionalsStructWithValue:listNullablesAndOptionalsStructArgument
                                                             completion:^(NSError * _Nullable err) {
                                                                 NSLog(@"Write list of structs containing nullables and optionals "
                                                                       @"Error: %@",
                                                                     err);

                                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                                 NextTest();
                                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadListOfStructsContainingNullablesAndOptionalsAfterWriting_182()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeListNullablesAndOptionalsStructWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read list of structs containing nullables and optionals after writing Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("list_nullables_and_optionals_struct", [actualValue count], static_cast<uint32_t>(1)));
                VerifyOrReturn(CheckValueNull(
                    "NullableInt", ((MTRUnitTestingClusterNullablesAndOptionalsStruct *) actualValue[0]).nullableInt));
                VerifyOrReturn(CheckValueNull(
                    "NullableString", ((MTRUnitTestingClusterNullablesAndOptionalsStruct *) actualValue[0]).nullableString));
                VerifyOrReturn(CheckValueNull(
                    "NullableStruct", ((MTRUnitTestingClusterNullablesAndOptionalsStruct *) actualValue[0]).nullableStruct));
                VerifyOrReturn(CheckValueNonNull(
                    "NullableList", ((MTRUnitTestingClusterNullablesAndOptionalsStruct *) actualValue[0]).nullableList));
                VerifyOrReturn(CheckValue("NullableList",
                    [((MTRUnitTestingClusterNullablesAndOptionalsStruct *) actualValue[0]).nullableList count],
                    static_cast<uint32_t>(2)));
                VerifyOrReturn(
                    CheckValue("", ((MTRUnitTestingClusterNullablesAndOptionalsStruct *) actualValue[0]).nullableList[0], 1U));
                VerifyOrReturn(
                    CheckValue("", ((MTRUnitTestingClusterNullablesAndOptionalsStruct *) actualValue[0]).nullableList[1], 2U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableBooleanNull_183()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableBooleanArgument;
        nullableBooleanArgument = nil;
        [cluster writeAttributeNullableBooleanWithValue:nullableBooleanArgument
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"Write attribute NULLABLE_BOOLEAN null Error: %@", err);

                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nullable booValueNull;

    CHIP_ERROR TestReadAttributeNullableBooleanNull_184()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBooleanWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_BOOLEAN null Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_boolean", actualValue));
            }
            {
                booValueNull = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableBooleanTrue_185()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableBooleanArgument;
        nullableBooleanArgument = [NSNumber numberWithBool:true];
        [cluster writeAttributeNullableBooleanWithValue:nullableBooleanArgument
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"Write attribute NULLABLE_BOOLEAN True Error: %@", err);

                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableBooleanTrue_186()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBooleanWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_BOOLEAN True Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_boolean", actualValue));
                VerifyOrReturn(CheckValue("nullable_boolean", actualValue, true));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableBooleanNotNull_187()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBooleanWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_BOOLEAN not null Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckConstraintNotValue("nullableBoolean", value, booValueNull));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableBitmap8MaxValue_188()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableBitmap8Argument;
        nullableBitmap8Argument = [NSNumber numberWithUnsignedChar:254U];
        [cluster writeAttributeNullableBitmap8WithValue:nullableBitmap8Argument
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"Write attribute NULLABLE_BITMAP8 Max Value Error: %@", err);

                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableBitmap8MaxValue_189()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBitmap8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_BITMAP8 Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_bitmap8", actualValue));
                VerifyOrReturn(CheckValue("nullable_bitmap8", actualValue, 254U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableBitmap8InvalidValue_190()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableBitmap8Argument;
        nullableBitmap8Argument = [NSNumber numberWithUnsignedChar:255U];
        [cluster writeAttributeNullableBitmap8WithValue:nullableBitmap8Argument
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"Write attribute NULLABLE_BITMAP8 Invalid Value Error: %@", err);

                                                 VerifyOrReturn(CheckValue("status",
                                                     err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                             ? err.code
                                                             : EMBER_ZCL_STATUS_FAILURE)
                                                         : 0,
                                                     EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nullable nullableValue254;

    CHIP_ERROR TestReadAttributeNullableBitmap8UnchangedValue_191()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBitmap8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_BITMAP8 unchanged Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_bitmap8", actualValue));
                VerifyOrReturn(CheckValue("nullable_bitmap8", actualValue, 254U));
            }
            {
                nullableValue254 = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableBitmap8NullValue_192()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableBitmap8Argument;
        nullableBitmap8Argument = nil;
        [cluster writeAttributeNullableBitmap8WithValue:nullableBitmap8Argument
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"Write attribute NULLABLE_BITMAP8 null Value Error: %@", err);

                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableBitmap8NullValue_193()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBitmap8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_BITMAP8 null Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_bitmap8", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableBitmap8Not254Value_194()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBitmap8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_BITMAP8 not 254 Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckConstraintNotValue("nullableBitmap8", value, nullableValue254));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableBitmap16MaxValue_195()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableBitmap16Argument;
        nullableBitmap16Argument = [NSNumber numberWithUnsignedShort:65534U];
        [cluster writeAttributeNullableBitmap16WithValue:nullableBitmap16Argument
                                              completion:^(NSError * _Nullable err) {
                                                  NSLog(@"Write attribute NULLABLE_BITMAP16 Max Value Error: %@", err);

                                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableBitmap16MaxValue_196()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBitmap16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_BITMAP16 Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_bitmap16", actualValue));
                VerifyOrReturn(CheckValue("nullable_bitmap16", actualValue, 65534U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableBitmap16InvalidValue_197()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableBitmap16Argument;
        nullableBitmap16Argument = [NSNumber numberWithUnsignedShort:65535U];
        [cluster writeAttributeNullableBitmap16WithValue:nullableBitmap16Argument
                                              completion:^(NSError * _Nullable err) {
                                                  NSLog(@"Write attribute NULLABLE_BITMAP16 Invalid Value Error: %@", err);

                                                  VerifyOrReturn(CheckValue("status",
                                                      err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                              ? err.code
                                                              : EMBER_ZCL_STATUS_FAILURE)
                                                          : 0,
                                                      EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableBitmap16UnchangedValue_198()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBitmap16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_BITMAP16 unchanged Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_bitmap16", actualValue));
                VerifyOrReturn(CheckValue("nullable_bitmap16", actualValue, 65534U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableBitmap16NullValue_199()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableBitmap16Argument;
        nullableBitmap16Argument = nil;
        [cluster writeAttributeNullableBitmap16WithValue:nullableBitmap16Argument
                                              completion:^(NSError * _Nullable err) {
                                                  NSLog(@"Write attribute NULLABLE_BITMAP16 null Value Error: %@", err);

                                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableBitmap16NullValue_200()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBitmap16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_BITMAP16 null Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_bitmap16", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableBitmap32MaxValue_201()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableBitmap32Argument;
        nullableBitmap32Argument = [NSNumber numberWithUnsignedInt:4294967294UL];
        [cluster writeAttributeNullableBitmap32WithValue:nullableBitmap32Argument
                                              completion:^(NSError * _Nullable err) {
                                                  NSLog(@"Write attribute NULLABLE_BITMAP32 Max Value Error: %@", err);

                                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableBitmap32MaxValue_202()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBitmap32WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_BITMAP32 Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_bitmap32", actualValue));
                VerifyOrReturn(CheckValue("nullable_bitmap32", actualValue, 4294967294UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableBitmap32InvalidValue_203()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableBitmap32Argument;
        nullableBitmap32Argument = [NSNumber numberWithUnsignedInt:4294967295UL];
        [cluster writeAttributeNullableBitmap32WithValue:nullableBitmap32Argument
                                              completion:^(NSError * _Nullable err) {
                                                  NSLog(@"Write attribute NULLABLE_BITMAP32 Invalid Value Error: %@", err);

                                                  VerifyOrReturn(CheckValue("status",
                                                      err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                              ? err.code
                                                              : EMBER_ZCL_STATUS_FAILURE)
                                                          : 0,
                                                      EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableBitmap32UnchangedValue_204()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBitmap32WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_BITMAP32 unchanged Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_bitmap32", actualValue));
                VerifyOrReturn(CheckValue("nullable_bitmap32", actualValue, 4294967294UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableBitmap32NullValue_205()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableBitmap32Argument;
        nullableBitmap32Argument = nil;
        [cluster writeAttributeNullableBitmap32WithValue:nullableBitmap32Argument
                                              completion:^(NSError * _Nullable err) {
                                                  NSLog(@"Write attribute NULLABLE_BITMAP32 null Value Error: %@", err);

                                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableBitmap32NullValue_206()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBitmap32WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_BITMAP32 null Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_bitmap32", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableBitmap64MaxValue_207()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableBitmap64Argument;
        nullableBitmap64Argument = [NSNumber numberWithUnsignedLongLong:18446744073709551614ULL];
        [cluster writeAttributeNullableBitmap64WithValue:nullableBitmap64Argument
                                              completion:^(NSError * _Nullable err) {
                                                  NSLog(@"Write attribute NULLABLE_BITMAP64 Max Value Error: %@", err);

                                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableBitmap64MaxValue_208()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBitmap64WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_BITMAP64 Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_bitmap64", actualValue));
                VerifyOrReturn(CheckValue("nullable_bitmap64", actualValue, 18446744073709551614ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableBitmap64InvalidValue_209()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableBitmap64Argument;
        nullableBitmap64Argument = [NSNumber numberWithUnsignedLongLong:18446744073709551615ULL];
        [cluster writeAttributeNullableBitmap64WithValue:nullableBitmap64Argument
                                              completion:^(NSError * _Nullable err) {
                                                  NSLog(@"Write attribute NULLABLE_BITMAP64 Invalid Value Error: %@", err);

                                                  VerifyOrReturn(CheckValue("status",
                                                      err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                              ? err.code
                                                              : EMBER_ZCL_STATUS_FAILURE)
                                                          : 0,
                                                      EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableBitmap64UnchangedValue_210()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBitmap64WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_BITMAP64 unchanged Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_bitmap64", actualValue));
                VerifyOrReturn(CheckValue("nullable_bitmap64", actualValue, 18446744073709551614ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableBitmap64NullValue_211()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableBitmap64Argument;
        nullableBitmap64Argument = nil;
        [cluster writeAttributeNullableBitmap64WithValue:nullableBitmap64Argument
                                              completion:^(NSError * _Nullable err) {
                                                  NSLog(@"Write attribute NULLABLE_BITMAP64 null Value Error: %@", err);

                                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableBitmap64NullValue_212()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBitmap64WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_BITMAP64 null Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_bitmap64", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt8uMinValue_213()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt8uArgument;
        nullableInt8uArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeNullableInt8uWithValue:nullableInt8uArgument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"Write attribute NULLABLE_INT8U Min Value Error: %@", err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt8uMinValue_214()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT8U Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_int8u", actualValue));
                VerifyOrReturn(CheckValue("nullable_int8u", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt8uMaxValue_215()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt8uArgument;
        nullableInt8uArgument = [NSNumber numberWithUnsignedChar:254U];
        [cluster writeAttributeNullableInt8uWithValue:nullableInt8uArgument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"Write attribute NULLABLE_INT8U Max Value Error: %@", err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt8uMaxValue_216()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT8U Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_int8u", actualValue));
                VerifyOrReturn(CheckValue("nullable_int8u", actualValue, 254U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt8uInvalidValue_217()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt8uArgument;
        nullableInt8uArgument = [NSNumber numberWithUnsignedChar:255U];
        [cluster writeAttributeNullableInt8uWithValue:nullableInt8uArgument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"Write attribute NULLABLE_INT8U Invalid Value Error: %@", err);

                                               VerifyOrReturn(CheckValue("status",
                                                   err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                           ? err.code
                                                           : EMBER_ZCL_STATUS_FAILURE)
                                                       : 0,
                                                   EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt8uUnchangedValue_218()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT8U unchanged Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_int8u", actualValue));
                VerifyOrReturn(CheckValue("nullable_int8u", actualValue, 254U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt8uUnchangedValueWithConstraint_219()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT8U unchanged Value with constraint Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckValueNonNull("nullableInt8u", value));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt8uNullValue_220()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt8uArgument;
        nullableInt8uArgument = nil;
        [cluster writeAttributeNullableInt8uWithValue:nullableInt8uArgument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"Write attribute NULLABLE_INT8U null Value Error: %@", err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt8uNullValue_221()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT8U null Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_int8u", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt8uNullValueRange_222()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT8U null Value & range Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("nullableInt8u", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("nullableInt8u", [value unsignedCharValue], 254U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt8uNullValueNot_223()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT8U null Value & not Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckConstraintNotValue("nullableInt8u", value, 254U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt8uValue_224()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt8uArgument;
        nullableInt8uArgument = [NSNumber numberWithUnsignedChar:128U];
        [cluster writeAttributeNullableInt8uWithValue:nullableInt8uArgument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"Write attribute NULLABLE_INT8U Value Error: %@", err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt8uValueInRange_225()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT8U Value in range Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("nullableInt8u", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("nullableInt8u", [value unsignedCharValue], 254U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt8uNotValueOk_226()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT8U notValue OK Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckConstraintNotValue("nullableInt8u", value, 129U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt16uMinValue_227()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt16uArgument;
        nullableInt16uArgument = [NSNumber numberWithUnsignedShort:0U];
        [cluster writeAttributeNullableInt16uWithValue:nullableInt16uArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT16U Min Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt16uMinValue_228()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT16U Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_int16u", actualValue));
                VerifyOrReturn(CheckValue("nullable_int16u", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt16uMaxValue_229()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt16uArgument;
        nullableInt16uArgument = [NSNumber numberWithUnsignedShort:65534U];
        [cluster writeAttributeNullableInt16uWithValue:nullableInt16uArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT16U Max Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt16uMaxValue_230()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT16U Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_int16u", actualValue));
                VerifyOrReturn(CheckValue("nullable_int16u", actualValue, 65534U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt16uInvalidValue_231()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt16uArgument;
        nullableInt16uArgument = [NSNumber numberWithUnsignedShort:65535U];
        [cluster writeAttributeNullableInt16uWithValue:nullableInt16uArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT16U Invalid Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status",
                                                    err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                            ? err.code
                                                            : EMBER_ZCL_STATUS_FAILURE)
                                                        : 0,
                                                    EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt16uUnchangedValue_232()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT16U unchanged Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_int16u", actualValue));
                VerifyOrReturn(CheckValue("nullable_int16u", actualValue, 65534U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt16uNullValue_233()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt16uArgument;
        nullableInt16uArgument = nil;
        [cluster writeAttributeNullableInt16uWithValue:nullableInt16uArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT16U null Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt16uNullValue_234()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT16U null Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_int16u", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt16uNullValueRange_235()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT16U null Value & range Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("nullableInt16u", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("nullableInt16u", [value unsignedShortValue], 65534U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt16uNullValueNot_236()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT16U null Value & not Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckConstraintNotValue("nullableInt16u", value, 65534U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt16uValue_237()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt16uArgument;
        nullableInt16uArgument = [NSNumber numberWithUnsignedShort:32000U];
        [cluster writeAttributeNullableInt16uWithValue:nullableInt16uArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT16U Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt16uValueInRange_238()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT16U Value in range Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<uint16_t>("nullableInt16u", [value unsignedShortValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("nullableInt16u", [value unsignedShortValue], 65534U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt16uNotValueOk_239()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT16U notValue OK Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckConstraintNotValue("nullableInt16u", value, 32001U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt32uMinValue_240()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt32uArgument;
        nullableInt32uArgument = [NSNumber numberWithUnsignedInt:0UL];
        [cluster writeAttributeNullableInt32uWithValue:nullableInt32uArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT32U Min Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt32uMinValue_241()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT32U Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_int32u", actualValue));
                VerifyOrReturn(CheckValue("nullable_int32u", actualValue, 0UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt32uMaxValue_242()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt32uArgument;
        nullableInt32uArgument = [NSNumber numberWithUnsignedInt:4294967294UL];
        [cluster writeAttributeNullableInt32uWithValue:nullableInt32uArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT32U Max Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt32uMaxValue_243()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT32U Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_int32u", actualValue));
                VerifyOrReturn(CheckValue("nullable_int32u", actualValue, 4294967294UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt32uInvalidValue_244()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt32uArgument;
        nullableInt32uArgument = [NSNumber numberWithUnsignedInt:4294967295UL];
        [cluster writeAttributeNullableInt32uWithValue:nullableInt32uArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT32U Invalid Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status",
                                                    err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                            ? err.code
                                                            : EMBER_ZCL_STATUS_FAILURE)
                                                        : 0,
                                                    EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt32uUnchangedValue_245()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT32U unchanged Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_int32u", actualValue));
                VerifyOrReturn(CheckValue("nullable_int32u", actualValue, 4294967294UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt32uNullValue_246()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt32uArgument;
        nullableInt32uArgument = nil;
        [cluster writeAttributeNullableInt32uWithValue:nullableInt32uArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT32U null Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt32uNullValue_247()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT32U null Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_int32u", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt32uNullValueRange_248()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT32U null Value & range Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<uint32_t>("nullableInt32u", [value unsignedIntValue], 0UL));
                VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("nullableInt32u", [value unsignedIntValue], 4294967294UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt32uNullValueNot_249()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT32U null Value & not Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckConstraintNotValue("nullableInt32u", value, 4294967294UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt32uValue_250()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt32uArgument;
        nullableInt32uArgument = [NSNumber numberWithUnsignedInt:2147483647UL];
        [cluster writeAttributeNullableInt32uWithValue:nullableInt32uArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT32U Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt32uValueInRange_251()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT32U Value in range Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<uint32_t>("nullableInt32u", [value unsignedIntValue], 0UL));
                VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("nullableInt32u", [value unsignedIntValue], 4294967294UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt32uNotValueOk_252()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT32U notValue OK Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckConstraintNotValue("nullableInt32u", value, 2147483648UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt64uMinValue_253()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt64uArgument;
        nullableInt64uArgument = [NSNumber numberWithUnsignedLongLong:0ULL];
        [cluster writeAttributeNullableInt64uWithValue:nullableInt64uArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT64U Min Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt64uMinValue_254()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt64uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT64U Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_int64u", actualValue));
                VerifyOrReturn(CheckValue("nullable_int64u", actualValue, 0ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt64uMaxValue_255()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt64uArgument;
        nullableInt64uArgument = [NSNumber numberWithUnsignedLongLong:18446744073709551614ULL];
        [cluster writeAttributeNullableInt64uWithValue:nullableInt64uArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT64U Max Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt64uMaxValue_256()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt64uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT64U Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_int64u", actualValue));
                VerifyOrReturn(CheckValue("nullable_int64u", actualValue, 18446744073709551614ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt64uInvalidValue_257()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt64uArgument;
        nullableInt64uArgument = [NSNumber numberWithUnsignedLongLong:18446744073709551615ULL];
        [cluster writeAttributeNullableInt64uWithValue:nullableInt64uArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT64U Invalid Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status",
                                                    err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                            ? err.code
                                                            : EMBER_ZCL_STATUS_FAILURE)
                                                        : 0,
                                                    EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt64uUnchangedValue_258()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt64uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT64U unchanged Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_int64u", actualValue));
                VerifyOrReturn(CheckValue("nullable_int64u", actualValue, 18446744073709551614ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt64uNullValue_259()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt64uArgument;
        nullableInt64uArgument = nil;
        [cluster writeAttributeNullableInt64uWithValue:nullableInt64uArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT64U null Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt64uNullValue_260()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt64uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT64U null Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_int64u", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt64uNullValueRange_261()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt64uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT64U null Value & range Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<uint64_t>("nullableInt64u", [value unsignedLongLongValue], 0ULL));
                VerifyOrReturn(
                    CheckConstraintMaxValue<uint64_t>("nullableInt64u", [value unsignedLongLongValue], 18446744073709551614ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt64uNullValueNot_262()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt64uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT64U null Value & not Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckConstraintNotValue("nullableInt64u", value, 18446744073709551614ULL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt64uValue_263()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt64uArgument;
        nullableInt64uArgument = [NSNumber numberWithUnsignedLongLong:18000000000000000000ULL];
        [cluster writeAttributeNullableInt64uWithValue:nullableInt64uArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT64U Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt64uValueInRange_264()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt64uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT64U Value in range Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<uint64_t>("nullableInt64u", [value unsignedLongLongValue], 0ULL));
                VerifyOrReturn(
                    CheckConstraintMaxValue<uint64_t>("nullableInt64u", [value unsignedLongLongValue], 18446744073709551614ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt64uNotValueOk_265()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt64uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT64U notValue OK Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckConstraintNotValue("nullableInt64u", value, 18000000000000000001ULL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt8sMinValue_266()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt8sArgument;
        nullableInt8sArgument = [NSNumber numberWithChar:-127];
        [cluster writeAttributeNullableInt8sWithValue:nullableInt8sArgument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"Write attribute NULLABLE_INT8S Min Value Error: %@", err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt8sMinValue_267()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT8S Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_int8s", actualValue));
                VerifyOrReturn(CheckValue("nullable_int8s", actualValue, -127));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt8sInvalidValue_268()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt8sArgument;
        nullableInt8sArgument = [NSNumber numberWithChar:-128];
        [cluster writeAttributeNullableInt8sWithValue:nullableInt8sArgument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"Write attribute NULLABLE_INT8S Invalid Value Error: %@", err);

                                               VerifyOrReturn(CheckValue("status",
                                                   err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                           ? err.code
                                                           : EMBER_ZCL_STATUS_FAILURE)
                                                       : 0,
                                                   EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt8sUnchangedValue_269()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT8S unchanged Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_int8s", actualValue));
                VerifyOrReturn(CheckValue("nullable_int8s", actualValue, -127));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt8sNullValue_270()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt8sArgument;
        nullableInt8sArgument = nil;
        [cluster writeAttributeNullableInt8sWithValue:nullableInt8sArgument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"Write attribute NULLABLE_INT8S null Value Error: %@", err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt8sNullValue_271()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT8S null Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_int8s", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt8sNullValueRange_272()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT8S null Value & range Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<int8_t>("nullableInt8s", [value charValue], -127));
                VerifyOrReturn(CheckConstraintMaxValue<int8_t>("nullableInt8s", [value charValue], 127));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt8sNullValueNot_273()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT8S null Value & not Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckConstraintNotValue("nullableInt8s", value, -127));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt8sValue_274()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt8sArgument;
        nullableInt8sArgument = [NSNumber numberWithChar:-127];
        [cluster writeAttributeNullableInt8sWithValue:nullableInt8sArgument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"Write attribute NULLABLE_INT8S Value Error: %@", err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt8sValueInRange_275()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT8S Value in range Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<int8_t>("nullableInt8s", [value charValue], -127));
                VerifyOrReturn(CheckConstraintMaxValue<int8_t>("nullableInt8s", [value charValue], 127));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt8sNotValueOk_276()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT8S notValue OK Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckConstraintNotValue("nullableInt8s", value, -126));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt16sMinValue_277()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt16sArgument;
        nullableInt16sArgument = [NSNumber numberWithShort:-32767];
        [cluster writeAttributeNullableInt16sWithValue:nullableInt16sArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT16S Min Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt16sMinValue_278()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT16S Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_int16s", actualValue));
                VerifyOrReturn(CheckValue("nullable_int16s", actualValue, -32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt16sInvalidValue_279()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt16sArgument;
        nullableInt16sArgument = [NSNumber numberWithShort:-32768];
        [cluster writeAttributeNullableInt16sWithValue:nullableInt16sArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT16S Invalid Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status",
                                                    err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                            ? err.code
                                                            : EMBER_ZCL_STATUS_FAILURE)
                                                        : 0,
                                                    EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt16sUnchangedValue_280()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT16S unchanged Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_int16s", actualValue));
                VerifyOrReturn(CheckValue("nullable_int16s", actualValue, -32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt16sNullValue_281()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt16sArgument;
        nullableInt16sArgument = nil;
        [cluster writeAttributeNullableInt16sWithValue:nullableInt16sArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT16S null Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt16sNullValue_282()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT16S null Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_int16s", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt16sNullValueRange_283()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT16S null Value & range Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<int16_t>("nullableInt16s", [value shortValue], -32767));
                VerifyOrReturn(CheckConstraintMaxValue<int16_t>("nullableInt16s", [value shortValue], 32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt16sNullValueNot_284()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT16S null Value & not Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckConstraintNotValue("nullableInt16s", value, -32767));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt16sValue_285()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt16sArgument;
        nullableInt16sArgument = [NSNumber numberWithShort:-32767];
        [cluster writeAttributeNullableInt16sWithValue:nullableInt16sArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT16S Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt16sValueInRange_286()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT16S Value in range Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<int16_t>("nullableInt16s", [value shortValue], -32767));
                VerifyOrReturn(CheckConstraintMaxValue<int16_t>("nullableInt16s", [value shortValue], 32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt16sNotValueOk_287()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT16S notValue OK Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckConstraintNotValue("nullableInt16s", value, -32766));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt32sMinValue_288()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt32sArgument;
        nullableInt32sArgument = [NSNumber numberWithInt:-2147483647L];
        [cluster writeAttributeNullableInt32sWithValue:nullableInt32sArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT32S Min Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt32sMinValue_289()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt32sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT32S Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_int32s", actualValue));
                VerifyOrReturn(CheckValue("nullable_int32s", actualValue, -2147483647L));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt32sInvalidValue_290()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt32sArgument;
        nullableInt32sArgument = [NSNumber numberWithInt:-2147483648L];
        [cluster writeAttributeNullableInt32sWithValue:nullableInt32sArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT32S Invalid Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status",
                                                    err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                            ? err.code
                                                            : EMBER_ZCL_STATUS_FAILURE)
                                                        : 0,
                                                    EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt32sUnchangedValue_291()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt32sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT32S unchanged Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_int32s", actualValue));
                VerifyOrReturn(CheckValue("nullable_int32s", actualValue, -2147483647L));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt32sNullValue_292()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt32sArgument;
        nullableInt32sArgument = nil;
        [cluster writeAttributeNullableInt32sWithValue:nullableInt32sArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT32S null Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt32sNullValue_293()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt32sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT32S null Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_int32s", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt32sNullValueRange_294()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt32sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT32S null Value & range Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<int32_t>("nullableInt32s", [value intValue], -2147483647L));
                VerifyOrReturn(CheckConstraintMaxValue<int32_t>("nullableInt32s", [value intValue], 2147483647L));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt32sNullValueNot_295()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt32sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT32S null Value & not Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckConstraintNotValue("nullableInt32s", value, -2147483647L));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt32sValue_296()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt32sArgument;
        nullableInt32sArgument = [NSNumber numberWithInt:-2147483647L];
        [cluster writeAttributeNullableInt32sWithValue:nullableInt32sArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT32S Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt32sValueInRange_297()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt32sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT32S Value in range Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<int32_t>("nullableInt32s", [value intValue], -2147483647L));
                VerifyOrReturn(CheckConstraintMaxValue<int32_t>("nullableInt32s", [value intValue], 2147483647L));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt32sNotValueOk_298()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt32sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT32S notValue OK Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckConstraintNotValue("nullableInt32s", value, -2147483646L));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt64sMinValue_299()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt64sArgument;
        nullableInt64sArgument = [NSNumber numberWithLongLong:-9223372036854775807LL];
        [cluster writeAttributeNullableInt64sWithValue:nullableInt64sArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT64S Min Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt64sMinValue_300()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt64sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT64S Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_int64s", actualValue));
                VerifyOrReturn(CheckValue("nullable_int64s", actualValue, -9223372036854775807LL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt64sInvalidValue_301()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt64sArgument;
        nullableInt64sArgument = [NSNumber numberWithLongLong:-9223372036854775807LL - 1LL];
        [cluster writeAttributeNullableInt64sWithValue:nullableInt64sArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT64S Invalid Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status",
                                                    err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                            ? err.code
                                                            : EMBER_ZCL_STATUS_FAILURE)
                                                        : 0,
                                                    EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt64sUnchangedValue_302()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt64sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT64S unchanged Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_int64s", actualValue));
                VerifyOrReturn(CheckValue("nullable_int64s", actualValue, -9223372036854775807LL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt64sNullValue_303()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt64sArgument;
        nullableInt64sArgument = nil;
        [cluster writeAttributeNullableInt64sWithValue:nullableInt64sArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT64S null Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt64sNullValue_304()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt64sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT64S null Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_int64s", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt64sNullValueRange_305()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt64sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT64S null Value & range Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<int64_t>("nullableInt64s", [value longLongValue], -9223372036854775807LL));
                VerifyOrReturn(CheckConstraintMaxValue<int64_t>("nullableInt64s", [value longLongValue], 9223372036854775807LL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt64sNullValueNot_306()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt64sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT64S null Value & not Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckConstraintNotValue("nullableInt64s", value, -9223372036854775807LL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableInt64sValue_307()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt64sArgument;
        nullableInt64sArgument = [NSNumber numberWithLongLong:-9223372036854775807LL];
        [cluster writeAttributeNullableInt64sWithValue:nullableInt64sArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_INT64S Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt64sValueInRange_308()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt64sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT64S Value in range Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {

                VerifyOrReturn(CheckConstraintMinValue<int64_t>("nullableInt64s", [value longLongValue], -9223372036854775807LL));
                VerifyOrReturn(CheckConstraintMaxValue<int64_t>("nullableInt64s", [value longLongValue], 9223372036854775807LL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableInt64sNotValueOk_309()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt64sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_INT64S notValue OK Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckConstraintNotValue("nullableInt64s", value, -9223372036854775806LL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableSingleMediumValue_310()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableFloatSingleArgument;
        nullableFloatSingleArgument = [NSNumber numberWithFloat:0.1f];
        [cluster writeAttributeNullableFloatSingleWithValue:nullableFloatSingleArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"Write attribute NULLABLE_SINGLE medium Value Error: %@", err);

                                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableSingleMediumValue_311()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableFloatSingleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_SINGLE medium Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_float_single", actualValue));
                VerifyOrReturn(CheckValue("nullable_float_single", actualValue, 0.1f));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableSingleLargestValue_312()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableFloatSingleArgument;
        nullableFloatSingleArgument = [NSNumber numberWithFloat:INFINITY];
        [cluster writeAttributeNullableFloatSingleWithValue:nullableFloatSingleArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"Write attribute NULLABLE_SINGLE largest Value Error: %@", err);

                                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableSingleLargestValue_313()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableFloatSingleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_SINGLE largest Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_float_single", actualValue));
                VerifyOrReturn(CheckValue("nullable_float_single", actualValue, INFINITY));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableSingleSmallestValue_314()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableFloatSingleArgument;
        nullableFloatSingleArgument = [NSNumber numberWithFloat:-INFINITY];
        [cluster writeAttributeNullableFloatSingleWithValue:nullableFloatSingleArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"Write attribute NULLABLE_SINGLE smallest Value Error: %@", err);

                                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableSingleSmallestValue_315()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableFloatSingleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_SINGLE smallest Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_float_single", actualValue));
                VerifyOrReturn(CheckValue("nullable_float_single", actualValue, -INFINITY));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableSingleNullValue_316()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableFloatSingleArgument;
        nullableFloatSingleArgument = nil;
        [cluster writeAttributeNullableFloatSingleWithValue:nullableFloatSingleArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"Write attribute NULLABLE_SINGLE null Value Error: %@", err);

                                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableSingleNullValue_317()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableFloatSingleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_SINGLE null Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_float_single", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableSingle0Value_318()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableFloatSingleArgument;
        nullableFloatSingleArgument = [NSNumber numberWithFloat:0.0f];
        [cluster writeAttributeNullableFloatSingleWithValue:nullableFloatSingleArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"Write attribute NULLABLE_SINGLE 0 Value Error: %@", err);

                                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableSingle0Value_319()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableFloatSingleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_SINGLE 0 Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_float_single", actualValue));
                VerifyOrReturn(CheckValue("nullable_float_single", actualValue, 0.0f));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableDoubleMediumValue_320()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableFloatDoubleArgument;
        nullableFloatDoubleArgument = [NSNumber numberWithDouble:0.1234567890123];
        [cluster writeAttributeNullableFloatDoubleWithValue:nullableFloatDoubleArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"Write attribute NULLABLE_DOUBLE medium Value Error: %@", err);

                                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableDoubleMediumValue_321()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableFloatDoubleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_DOUBLE medium Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_float_double", actualValue));
                VerifyOrReturn(CheckValue("nullable_float_double", actualValue, 0.1234567890123));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableDoubleLargestValue_322()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableFloatDoubleArgument;
        nullableFloatDoubleArgument = [NSNumber numberWithDouble:INFINITY];
        [cluster writeAttributeNullableFloatDoubleWithValue:nullableFloatDoubleArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"Write attribute NULLABLE_DOUBLE largest Value Error: %@", err);

                                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableDoubleLargestValue_323()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableFloatDoubleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_DOUBLE largest Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_float_double", actualValue));
                VerifyOrReturn(CheckValue("nullable_float_double", actualValue, INFINITY));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableDoubleSmallestValue_324()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableFloatDoubleArgument;
        nullableFloatDoubleArgument = [NSNumber numberWithDouble:-INFINITY];
        [cluster writeAttributeNullableFloatDoubleWithValue:nullableFloatDoubleArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"Write attribute NULLABLE_DOUBLE smallest Value Error: %@", err);

                                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableDoubleSmallestValue_325()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableFloatDoubleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_DOUBLE smallest Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_float_double", actualValue));
                VerifyOrReturn(CheckValue("nullable_float_double", actualValue, -INFINITY));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableDoubleNullValue_326()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableFloatDoubleArgument;
        nullableFloatDoubleArgument = nil;
        [cluster writeAttributeNullableFloatDoubleWithValue:nullableFloatDoubleArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"Write attribute NULLABLE_DOUBLE null Value Error: %@", err);

                                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableDoubleNullValue_327()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableFloatDoubleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_DOUBLE null Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_float_double", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableDouble0Value_328()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableFloatDoubleArgument;
        nullableFloatDoubleArgument = [NSNumber numberWithDouble:0];
        [cluster writeAttributeNullableFloatDoubleWithValue:nullableFloatDoubleArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"Write attribute NULLABLE_DOUBLE 0 Value Error: %@", err);

                                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableDouble0Value_329()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableFloatDoubleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_DOUBLE 0 Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_float_double", actualValue));
                VerifyOrReturn(CheckValue("nullable_float_double", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableEnum8MinValue_330()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableEnum8Argument;
        nullableEnum8Argument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeNullableEnum8WithValue:nullableEnum8Argument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"Write attribute NULLABLE_ENUM8 Min Value Error: %@", err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableEnum8MinValue_331()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableEnum8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_ENUM8 Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_enum8", actualValue));
                VerifyOrReturn(CheckValue("nullable_enum8", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableEnum8MaxValue_332()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableEnum8Argument;
        nullableEnum8Argument = [NSNumber numberWithUnsignedChar:254U];
        [cluster writeAttributeNullableEnum8WithValue:nullableEnum8Argument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"Write attribute NULLABLE_ENUM8 Max Value Error: %@", err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableEnum8MaxValue_333()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableEnum8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_ENUM8 Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_enum8", actualValue));
                VerifyOrReturn(CheckValue("nullable_enum8", actualValue, 254U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableEnum8InvalidValue_334()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableEnum8Argument;
        nullableEnum8Argument = [NSNumber numberWithUnsignedChar:255U];
        [cluster writeAttributeNullableEnum8WithValue:nullableEnum8Argument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"Write attribute NULLABLE_ENUM8 Invalid Value Error: %@", err);

                                               VerifyOrReturn(CheckValue("status",
                                                   err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                           ? err.code
                                                           : EMBER_ZCL_STATUS_FAILURE)
                                                       : 0,
                                                   EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableEnum8UnchangedValue_335()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableEnum8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_ENUM8 unchanged Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_enum8", actualValue));
                VerifyOrReturn(CheckValue("nullable_enum8", actualValue, 254U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableEnum8NullValue_336()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableEnum8Argument;
        nullableEnum8Argument = nil;
        [cluster writeAttributeNullableEnum8WithValue:nullableEnum8Argument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"Write attribute NULLABLE_ENUM8 null Value Error: %@", err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableEnum8NullValue_337()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableEnum8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_ENUM8 null Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_enum8", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableEnum16MinValue_338()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableEnum16Argument;
        nullableEnum16Argument = [NSNumber numberWithUnsignedShort:0U];
        [cluster writeAttributeNullableEnum16WithValue:nullableEnum16Argument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_ENUM16 Min Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableEnum16MinValue_339()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableEnum16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_ENUM16 Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_enum16", actualValue));
                VerifyOrReturn(CheckValue("nullable_enum16", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableEnum16MaxValue_340()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableEnum16Argument;
        nullableEnum16Argument = [NSNumber numberWithUnsignedShort:65534U];
        [cluster writeAttributeNullableEnum16WithValue:nullableEnum16Argument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_ENUM16 Max Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableEnum16MaxValue_341()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableEnum16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_ENUM16 Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_enum16", actualValue));
                VerifyOrReturn(CheckValue("nullable_enum16", actualValue, 65534U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableEnum16InvalidValue_342()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableEnum16Argument;
        nullableEnum16Argument = [NSNumber numberWithUnsignedShort:65535U];
        [cluster writeAttributeNullableEnum16WithValue:nullableEnum16Argument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_ENUM16 Invalid Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status",
                                                    err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                            ? err.code
                                                            : EMBER_ZCL_STATUS_FAILURE)
                                                        : 0,
                                                    EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableEnum16UnchangedValue_343()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableEnum16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_ENUM16 unchanged Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_enum16", actualValue));
                VerifyOrReturn(CheckValue("nullable_enum16", actualValue, 65534U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableEnum16NullValue_344()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableEnum16Argument;
        nullableEnum16Argument = nil;
        [cluster writeAttributeNullableEnum16WithValue:nullableEnum16Argument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute NULLABLE_ENUM16 null Value Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableEnum16NullValue_345()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableEnum16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_ENUM16 null Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_enum16", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableSimpleEnumMinValue_346()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableEnumAttrArgument;
        nullableEnumAttrArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeNullableEnumAttrWithValue:nullableEnumAttrArgument
                                              completion:^(NSError * _Nullable err) {
                                                  NSLog(@"Write attribute NULLABLE_SIMPLE_ENUM Min Value Error: %@", err);

                                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableSimpleEnumMinValue_347()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableEnumAttrWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_SIMPLE_ENUM Min Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_enum_attr", actualValue));
                VerifyOrReturn(CheckValue("nullable_enum_attr", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableSimpleEnumMaxValue_348()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableEnumAttrArgument;
        nullableEnumAttrArgument = [NSNumber numberWithUnsignedChar:3U];
        [cluster writeAttributeNullableEnumAttrWithValue:nullableEnumAttrArgument
                                              completion:^(NSError * _Nullable err) {
                                                  NSLog(@"Write attribute NULLABLE_SIMPLE_ENUM Max Value Error: %@", err);

                                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableSimpleEnumMaxValue_349()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableEnumAttrWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_SIMPLE_ENUM Max Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_enum_attr", actualValue));
                VerifyOrReturn(CheckValue("nullable_enum_attr", actualValue, 3U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableSimpleEnumInvalidValue_350()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableEnumAttrArgument;
        nullableEnumAttrArgument = [NSNumber numberWithUnsignedChar:255U];
        [cluster writeAttributeNullableEnumAttrWithValue:nullableEnumAttrArgument
                                              completion:^(NSError * _Nullable err) {
                                                  NSLog(@"Write attribute NULLABLE_SIMPLE_ENUM Invalid Value Error: %@", err);

                                                  VerifyOrReturn(CheckValue("status",
                                                      err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                              ? err.code
                                                              : EMBER_ZCL_STATUS_FAILURE)
                                                          : 0,
                                                      EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nullable nullableEnumAttr3;

    CHIP_ERROR TestReadAttributeNullableSimpleEnumUnchangedValue_351()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableEnumAttrWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_SIMPLE_ENUM unchanged Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_enum_attr", actualValue));
                VerifyOrReturn(CheckValue("nullable_enum_attr", actualValue, 3U));
            }
            {
                nullableEnumAttr3 = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableSimpleEnumNullValue_352()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableEnumAttrArgument;
        nullableEnumAttrArgument = nil;
        [cluster writeAttributeNullableEnumAttrWithValue:nullableEnumAttrArgument
                                              completion:^(NSError * _Nullable err) {
                                                  NSLog(@"Write attribute NULLABLE_SIMPLE_ENUM null Value Error: %@", err);

                                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableSimpleEnumNullValue_353()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableEnumAttrWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_SIMPLE_ENUM null Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_enum_attr", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableSimpleEnumNot3Value_354()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableEnumAttrWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_SIMPLE_ENUM not 3 Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckConstraintNotValue("nullableEnumAttr", value, nullableEnumAttr3));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableOctetStringDefaultValue_355()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_OCTET_STRING Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_octet_string", actualValue));
                VerifyOrReturn(
                    CheckValueAsString("nullable_octet_string", actualValue, [[NSData alloc] initWithBytes:"" length:0]));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableOctetString_356()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableOctetStringArgument;
        nullableOctetStringArgument = [[NSData alloc] initWithBytes:"TestValue" length:9];
        [cluster writeAttributeNullableOctetStringWithValue:nullableOctetStringArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"Write attribute NULLABLE_OCTET_STRING Error: %@", err);

                                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }
    NSData * _Nullable nullableOctetStrTestValue;

    CHIP_ERROR TestReadAttributeNullableOctetString_357()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_OCTET_STRING Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_octet_string", actualValue));
                VerifyOrReturn(
                    CheckValueAsString("nullable_octet_string", actualValue, [[NSData alloc] initWithBytes:"TestValue" length:9]));
            }
            {
                nullableOctetStrTestValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableOctetString_358()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableOctetStringArgument;
        nullableOctetStringArgument = nil;
        [cluster writeAttributeNullableOctetStringWithValue:nullableOctetStringArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"Write attribute NULLABLE_OCTET_STRING Error: %@", err);

                                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableOctetString_359()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_OCTET_STRING Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_octet_string", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableOctetString_360()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableOctetStringArgument;
        nullableOctetStringArgument = [[NSData alloc] initWithBytes:"" length:0];
        [cluster writeAttributeNullableOctetStringWithValue:nullableOctetStringArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"Write attribute NULLABLE_OCTET_STRING Error: %@", err);

                                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableOctetString_361()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_OCTET_STRING Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_octet_string", actualValue));
                VerifyOrReturn(
                    CheckValueAsString("nullable_octet_string", actualValue, [[NSData alloc] initWithBytes:"" length:0]));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableOctetStringNotTestValue_362()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_OCTET_STRING not TestValue Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckConstraintNotValue("nullableOctetString", value, nullableOctetStrTestValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableCharStringDefaultValue_363()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_CHAR_STRING Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_char_string", actualValue));
                VerifyOrReturn(CheckValueAsString("nullable_char_string", actualValue, @""));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableCharString_364()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableCharStringArgument;
        nullableCharStringArgument = @"☉T☉";
        [cluster writeAttributeNullableCharStringWithValue:nullableCharStringArgument
                                                completion:^(NSError * _Nullable err) {
                                                    NSLog(@"Write attribute NULLABLE_CHAR_STRING Error: %@", err);

                                                    VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                    NextTest();
                                                }];

        return CHIP_NO_ERROR;
    }
    NSString * _Nullable nullableCharStringSave;

    CHIP_ERROR TestReadAttributeNullableCharString_365()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_CHAR_STRING Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_char_string", actualValue));
                VerifyOrReturn(CheckValueAsString("nullable_char_string", actualValue, @"☉T☉"));
            }
            {
                nullableCharStringSave = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableCharString_366()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_CHAR_STRING Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                if (nullableCharStringSave == nil) {
                    VerifyOrReturn(CheckValueNull("nullable_char_string", actualValue));
                } else {
                    VerifyOrReturn(CheckValueNonNull("nullable_char_string", actualValue));
                    VerifyOrReturn(CheckValueAsString("nullable_char_string", actualValue, nullableCharStringSave));
                }
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableCharStringValueTooLong_367()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableCharStringArgument;
        nullableCharStringArgument = nil;
        [cluster writeAttributeNullableCharStringWithValue:nullableCharStringArgument
                                                completion:^(NSError * _Nullable err) {
                                                    NSLog(@"Write attribute NULLABLE_CHAR_STRING - Value too long Error: %@", err);

                                                    VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                    NextTest();
                                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableCharString_368()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_CHAR_STRING Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_char_string", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableCharStringEmpty_369()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableCharStringArgument;
        nullableCharStringArgument = @"";
        [cluster writeAttributeNullableCharStringWithValue:nullableCharStringArgument
                                                completion:^(NSError * _Nullable err) {
                                                    NSLog(@"Write attribute NULLABLE_CHAR_STRING - Empty Error: %@", err);

                                                    VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                    NextTest();
                                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableCharString_370()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_CHAR_STRING Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_char_string", actualValue));
                VerifyOrReturn(CheckValueAsString("nullable_char_string", actualValue, @""));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeNullableCharStringNott_371()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute NULLABLE_CHAR_STRING not ☉T☉ Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckConstraintNotValue("nullableCharString", value, nullableCharStringSave));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeFromNonexistentEndpoint_372()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(200) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeListInt8uWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute from nonexistent endpoint. Error: %@", err);

            VerifyOrReturn(CheckValue("status",
                err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE) : 0,
                EMBER_ZCL_STATUS_UNSUPPORTED_ENDPOINT));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeFromNonexistentCluster_373()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeListInt8uWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute from nonexistent cluster. Error: %@", err);

            VerifyOrReturn(CheckValue("status",
                err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE) : 0,
                EMBER_ZCL_STATUS_UNSUPPORTED_CLUSTER));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendACommandThatTakesAnOptionalParameterButDoNotSetIt_374()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestSimpleOptionalArgumentRequestParams alloc] init];
        [cluster testSimpleOptionalArgumentRequestWithParams:params
                                                  completion:^(NSError * _Nullable err) {
                                                      NSLog(@"Send a command that takes an optional parameter but do not set it. "
                                                            @"Error: %@",
                                                          err);

                                                      VerifyOrReturn(CheckValue("status",
                                                          err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                  ? err.code
                                                                  : EMBER_ZCL_STATUS_FAILURE)
                                                              : 0,
                                                          EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                      NextTest();
                                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendACommandThatTakesAnOptionalParameterButDoNotSetIt_375()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestSimpleOptionalArgumentRequestParams alloc] init];
        params.arg1 = [NSNumber numberWithBool:1];
        [cluster testSimpleOptionalArgumentRequestWithParams:params
                                                  completion:^(NSError * _Nullable err) {
                                                      NSLog(@"Send a command that takes an optional parameter but do not set it. "
                                                            @"Error: %@",
                                                          err);

                                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                      NextTest();
                                                  }];

        return CHIP_NO_ERROR;
    }
    bool testSendClusterTestCluster_376_WaitForReport_Fulfilled = false;
    ResponseHandler _Nullable test_TestCluster_list_int8u_Reported = nil;

    CHIP_ERROR TestReportSubscribeToListAttribute_376()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        test_TestCluster_list_int8u_Reported = ^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Report: Subscribe to list attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("list_int8u", [actualValue count], static_cast<uint32_t>(4)));
                VerifyOrReturn(CheckValue("", actualValue[0], 1U));
                VerifyOrReturn(CheckValue("", actualValue[1], 2U));
                VerifyOrReturn(CheckValue("", actualValue[2], 3U));
                VerifyOrReturn(CheckValue("", actualValue[3], 4U));
            }

            testSendClusterTestCluster_376_WaitForReport_Fulfilled = true;
        };

        NextTest();
        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSubscribeToListAttribute_377()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        uint16_t minIntervalArgument = 2U;
        uint16_t maxIntervalArgument = 5U;
        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(minIntervalArgument)
                                                                   maxInterval:@(maxIntervalArgument)];
        params.filterByFabric = true;
        params.replaceExistingSubscriptions = true;
        [cluster subscribeAttributeListInt8uWithParams:params
            subscriptionEstablished:^{
                VerifyOrReturn(
                    testSendClusterTestCluster_376_WaitForReport_Fulfilled, SetCommandExitStatus(CHIP_ERROR_INCORRECT_STATE));
                NextTest();
            }
            reportHandler:^(NSArray * _Nullable value, NSError * _Nullable err) {
                NSLog(@"Subscribe to list attribute Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
                if (test_TestCluster_list_int8u_Reported != nil) {
                    ResponseHandler callback = test_TestCluster_list_int8u_Reported;
                    test_TestCluster_list_int8u_Reported = nil;
                    callback(value, err);
                }
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteSubscribedToListAttribute_378()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id listInt8uArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [NSNumber numberWithUnsignedChar:5U];
            temp_0[1] = [NSNumber numberWithUnsignedChar:6U];
            temp_0[2] = [NSNumber numberWithUnsignedChar:7U];
            temp_0[3] = [NSNumber numberWithUnsignedChar:8U];
            listInt8uArgument = temp_0;
        }
        [cluster writeAttributeListInt8uWithValue:listInt8uArgument
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(@"Write subscribed-to list attribute Error: %@", err);

                                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckForListAttributeReport_379()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        test_TestCluster_list_int8u_Reported = ^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check for list attribute report Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("list_int8u", [actualValue count], static_cast<uint32_t>(4)));
                VerifyOrReturn(CheckValue("", actualValue[0], 5U));
                VerifyOrReturn(CheckValue("", actualValue[1], 6U));
                VerifyOrReturn(CheckValue("", actualValue[2], 7U));
                VerifyOrReturn(CheckValue("", actualValue[3], 8U));
            }

            NextTest();
        };

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadRangeRestrictedUnsigned8BitInteger_380()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read range-restricted unsigned 8-bit integer Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("range_restricted_int8u", actualValue, 70U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMinValueToARangeRestrictedUnsigned8BitInteger_381()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt8uArgument;
        rangeRestrictedInt8uArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster
            writeAttributeRangeRestrictedInt8uWithValue:rangeRestrictedInt8uArgument
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"Write min value to a range-restricted unsigned 8-bit integer Error: %@",
                                                     err);

                                                 VerifyOrReturn(CheckValue("status",
                                                     err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                             ? err.code
                                                             : EMBER_ZCL_STATUS_FAILURE)
                                                         : 0,
                                                     EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteJustBelowRangeValueToARangeRestrictedUnsigned8BitInteger_382()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt8uArgument;
        rangeRestrictedInt8uArgument = [NSNumber numberWithUnsignedChar:19U];
        [cluster writeAttributeRangeRestrictedInt8uWithValue:rangeRestrictedInt8uArgument
                                                  completion:^(NSError * _Nullable err) {
                                                      NSLog(@"Write just-below-range value to a range-restricted unsigned 8-bit "
                                                            @"integer Error: %@",
                                                          err);

                                                      VerifyOrReturn(CheckValue("status",
                                                          err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                  ? err.code
                                                                  : EMBER_ZCL_STATUS_FAILURE)
                                                              : 0,
                                                          EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                      NextTest();
                                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteJustAboveRangeValueToARangeRestrictedUnsigned8BitInteger_383()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt8uArgument;
        rangeRestrictedInt8uArgument = [NSNumber numberWithUnsignedChar:101U];
        [cluster writeAttributeRangeRestrictedInt8uWithValue:rangeRestrictedInt8uArgument
                                                  completion:^(NSError * _Nullable err) {
                                                      NSLog(@"Write just-above-range value to a range-restricted unsigned 8-bit "
                                                            @"integer Error: %@",
                                                          err);

                                                      VerifyOrReturn(CheckValue("status",
                                                          err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                  ? err.code
                                                                  : EMBER_ZCL_STATUS_FAILURE)
                                                              : 0,
                                                          EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                      NextTest();
                                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMaxValueToARangeRestrictedUnsigned8BitInteger_384()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt8uArgument;
        rangeRestrictedInt8uArgument = [NSNumber numberWithUnsignedChar:255U];
        [cluster
            writeAttributeRangeRestrictedInt8uWithValue:rangeRestrictedInt8uArgument
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"Write max value to a range-restricted unsigned 8-bit integer Error: %@",
                                                     err);

                                                 VerifyOrReturn(CheckValue("status",
                                                     err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                             ? err.code
                                                             : EMBER_ZCL_STATUS_FAILURE)
                                                         : 0,
                                                     EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyRangeRestrictedUnsigned8BitIntegerValueHasNotChanged_385()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify range-restricted unsigned 8-bit integer value has not changed Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("range_restricted_int8u", actualValue, 70U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMinValidValueToARangeRestrictedUnsigned8BitInteger_386()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt8uArgument;
        rangeRestrictedInt8uArgument = [NSNumber numberWithUnsignedChar:20U];
        [cluster writeAttributeRangeRestrictedInt8uWithValue:rangeRestrictedInt8uArgument
                                                  completion:^(NSError * _Nullable err) {
                                                      NSLog(@"Write min valid value to a range-restricted unsigned 8-bit integer "
                                                            @"Error: %@",
                                                          err);

                                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                      NextTest();
                                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyRangeRestrictedUnsigned8BitIntegerValueIsAtMinValid_387()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify range-restricted unsigned 8-bit integer value is at min valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("range_restricted_int8u", actualValue, 20U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMaxValidValueToARangeRestrictedUnsigned8BitInteger_388()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt8uArgument;
        rangeRestrictedInt8uArgument = [NSNumber numberWithUnsignedChar:100U];
        [cluster writeAttributeRangeRestrictedInt8uWithValue:rangeRestrictedInt8uArgument
                                                  completion:^(NSError * _Nullable err) {
                                                      NSLog(@"Write max valid value to a range-restricted unsigned 8-bit integer "
                                                            @"Error: %@",
                                                          err);

                                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                      NextTest();
                                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyRangeRestrictedUnsigned8BitIntegerValueIsAtMaxValid_389()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify range-restricted unsigned 8-bit integer value is at max valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("range_restricted_int8u", actualValue, 100U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMiddleValidValueToARangeRestrictedUnsigned8BitInteger_390()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt8uArgument;
        rangeRestrictedInt8uArgument = [NSNumber numberWithUnsignedChar:50U];
        [cluster writeAttributeRangeRestrictedInt8uWithValue:rangeRestrictedInt8uArgument
                                                  completion:^(NSError * _Nullable err) {
                                                      NSLog(@"Write middle valid value to a range-restricted unsigned 8-bit "
                                                            @"integer Error: %@",
                                                          err);

                                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                      NextTest();
                                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyRangeRestrictedUnsigned8BitIntegerValueIsAtMidValid_391()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify range-restricted unsigned 8-bit integer value is at mid valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("range_restricted_int8u", actualValue, 50U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadRangeRestrictedUnsigned16BitInteger_392()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read range-restricted unsigned 16-bit integer Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("range_restricted_int16u", actualValue, 200U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMinValueToARangeRestrictedUnsigned16BitInteger_393()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt16uArgument;
        rangeRestrictedInt16uArgument = [NSNumber numberWithUnsignedShort:0U];
        [cluster
            writeAttributeRangeRestrictedInt16uWithValue:rangeRestrictedInt16uArgument
                                              completion:^(NSError * _Nullable err) {
                                                  NSLog(@"Write min value to a range-restricted unsigned 16-bit integer Error: %@",
                                                      err);

                                                  VerifyOrReturn(CheckValue("status",
                                                      err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                              ? err.code
                                                              : EMBER_ZCL_STATUS_FAILURE)
                                                          : 0,
                                                      EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteJustBelowRangeValueToARangeRestrictedUnsigned16BitInteger_394()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt16uArgument;
        rangeRestrictedInt16uArgument = [NSNumber numberWithUnsignedShort:99U];
        [cluster writeAttributeRangeRestrictedInt16uWithValue:rangeRestrictedInt16uArgument
                                                   completion:^(NSError * _Nullable err) {
                                                       NSLog(@"Write just-below-range value to a range-restricted unsigned 16-bit "
                                                             @"integer Error: %@",
                                                           err);

                                                       VerifyOrReturn(CheckValue("status",
                                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                   ? err.code
                                                                   : EMBER_ZCL_STATUS_FAILURE)
                                                               : 0,
                                                           EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                       NextTest();
                                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteJustAboveRangeValueToARangeRestrictedUnsigned16BitInteger_395()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt16uArgument;
        rangeRestrictedInt16uArgument = [NSNumber numberWithUnsignedShort:1001U];
        [cluster writeAttributeRangeRestrictedInt16uWithValue:rangeRestrictedInt16uArgument
                                                   completion:^(NSError * _Nullable err) {
                                                       NSLog(@"Write just-above-range value to a range-restricted unsigned 16-bit "
                                                             @"integer Error: %@",
                                                           err);

                                                       VerifyOrReturn(CheckValue("status",
                                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                   ? err.code
                                                                   : EMBER_ZCL_STATUS_FAILURE)
                                                               : 0,
                                                           EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                       NextTest();
                                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMaxValueToARangeRestrictedUnsigned16BitInteger_396()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt16uArgument;
        rangeRestrictedInt16uArgument = [NSNumber numberWithUnsignedShort:65535U];
        [cluster
            writeAttributeRangeRestrictedInt16uWithValue:rangeRestrictedInt16uArgument
                                              completion:^(NSError * _Nullable err) {
                                                  NSLog(@"Write max value to a range-restricted unsigned 16-bit integer Error: %@",
                                                      err);

                                                  VerifyOrReturn(CheckValue("status",
                                                      err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                              ? err.code
                                                              : EMBER_ZCL_STATUS_FAILURE)
                                                          : 0,
                                                      EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyRangeRestrictedUnsigned16BitIntegerValueHasNotChanged_397()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify range-restricted unsigned 16-bit integer value has not changed Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("range_restricted_int16u", actualValue, 200U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMinValidValueToARangeRestrictedUnsigned16BitInteger_398()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt16uArgument;
        rangeRestrictedInt16uArgument = [NSNumber numberWithUnsignedShort:100U];
        [cluster writeAttributeRangeRestrictedInt16uWithValue:rangeRestrictedInt16uArgument
                                                   completion:^(NSError * _Nullable err) {
                                                       NSLog(@"Write min valid value to a range-restricted unsigned 16-bit integer "
                                                             @"Error: %@",
                                                           err);

                                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                       NextTest();
                                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyRangeRestrictedUnsigned16BitIntegerValueIsAtMinValid_399()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify range-restricted unsigned 16-bit integer value is at min valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("range_restricted_int16u", actualValue, 100U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMaxValidValueToARangeRestrictedUnsigned16BitInteger_400()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt16uArgument;
        rangeRestrictedInt16uArgument = [NSNumber numberWithUnsignedShort:1000U];
        [cluster writeAttributeRangeRestrictedInt16uWithValue:rangeRestrictedInt16uArgument
                                                   completion:^(NSError * _Nullable err) {
                                                       NSLog(@"Write max valid value to a range-restricted unsigned 16-bit integer "
                                                             @"Error: %@",
                                                           err);

                                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                       NextTest();
                                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyRangeRestrictedUnsigned16BitIntegerValueIsAtMaxValid_401()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify range-restricted unsigned 16-bit integer value is at max valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("range_restricted_int16u", actualValue, 1000U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMiddleValidValueToARangeRestrictedUnsigned16BitInteger_402()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt16uArgument;
        rangeRestrictedInt16uArgument = [NSNumber numberWithUnsignedShort:500U];
        [cluster writeAttributeRangeRestrictedInt16uWithValue:rangeRestrictedInt16uArgument
                                                   completion:^(NSError * _Nullable err) {
                                                       NSLog(@"Write middle valid value to a range-restricted unsigned 16-bit "
                                                             @"integer Error: %@",
                                                           err);

                                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                       NextTest();
                                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyRangeRestrictedUnsigned16BitIntegerValueIsAtMidValid_403()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify range-restricted unsigned 16-bit integer value is at mid valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("range_restricted_int16u", actualValue, 500U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadRangeRestrictedSigned8BitInteger_404()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read range-restricted signed 8-bit integer Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("range_restricted_int8s", actualValue, -20));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMinValueToARangeRestrictedSigned8BitInteger_405()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt8sArgument;
        rangeRestrictedInt8sArgument = [NSNumber numberWithChar:-128];
        [cluster writeAttributeRangeRestrictedInt8sWithValue:rangeRestrictedInt8sArgument
                                                  completion:^(NSError * _Nullable err) {
                                                      NSLog(@"Write min value to a range-restricted signed 8-bit integer Error: %@",
                                                          err);

                                                      VerifyOrReturn(CheckValue("status",
                                                          err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                  ? err.code
                                                                  : EMBER_ZCL_STATUS_FAILURE)
                                                              : 0,
                                                          EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                      NextTest();
                                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteJustBelowRangeValueToARangeRestrictedSigned8BitInteger_406()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt8sArgument;
        rangeRestrictedInt8sArgument = [NSNumber numberWithChar:-41];
        [cluster writeAttributeRangeRestrictedInt8sWithValue:rangeRestrictedInt8sArgument
                                                  completion:^(NSError * _Nullable err) {
                                                      NSLog(@"Write just-below-range value to a range-restricted signed 8-bit "
                                                            @"integer Error: %@",
                                                          err);

                                                      VerifyOrReturn(CheckValue("status",
                                                          err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                  ? err.code
                                                                  : EMBER_ZCL_STATUS_FAILURE)
                                                              : 0,
                                                          EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                      NextTest();
                                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteJustAboveRangeValueToARangeRestrictedSigned8BitInteger_407()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt8sArgument;
        rangeRestrictedInt8sArgument = [NSNumber numberWithChar:51];
        [cluster writeAttributeRangeRestrictedInt8sWithValue:rangeRestrictedInt8sArgument
                                                  completion:^(NSError * _Nullable err) {
                                                      NSLog(@"Write just-above-range value to a range-restricted signed 8-bit "
                                                            @"integer Error: %@",
                                                          err);

                                                      VerifyOrReturn(CheckValue("status",
                                                          err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                  ? err.code
                                                                  : EMBER_ZCL_STATUS_FAILURE)
                                                              : 0,
                                                          EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                      NextTest();
                                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMaxValueToARangeRestrictedSigned8BitInteger_408()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt8sArgument;
        rangeRestrictedInt8sArgument = [NSNumber numberWithChar:127];
        [cluster writeAttributeRangeRestrictedInt8sWithValue:rangeRestrictedInt8sArgument
                                                  completion:^(NSError * _Nullable err) {
                                                      NSLog(@"Write max value to a range-restricted signed 8-bit integer Error: %@",
                                                          err);

                                                      VerifyOrReturn(CheckValue("status",
                                                          err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                  ? err.code
                                                                  : EMBER_ZCL_STATUS_FAILURE)
                                                              : 0,
                                                          EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                      NextTest();
                                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyRangeRestrictedSigned8BitIntegerValueHasNotChanged_409()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify range-restricted signed 8-bit integer value has not changed Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("range_restricted_int8s", actualValue, -20));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMinValidValueToARangeRestrictedSigned8BitInteger_410()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt8sArgument;
        rangeRestrictedInt8sArgument = [NSNumber numberWithChar:-40];
        [cluster
            writeAttributeRangeRestrictedInt8sWithValue:rangeRestrictedInt8sArgument
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(
                                                     @"Write min valid value to a range-restricted signed 8-bit integer Error: %@",
                                                     err);

                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyRangeRestrictedSigned8BitIntegerValueIsAtMinValid_411()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify range-restricted signed 8-bit integer value is at min valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("range_restricted_int8s", actualValue, -40));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMaxValidValueToARangeRestrictedSigned8BitInteger_412()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt8sArgument;
        rangeRestrictedInt8sArgument = [NSNumber numberWithChar:50];
        [cluster
            writeAttributeRangeRestrictedInt8sWithValue:rangeRestrictedInt8sArgument
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(
                                                     @"Write max valid value to a range-restricted signed 8-bit integer Error: %@",
                                                     err);

                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyRangeRestrictedSigned8BitIntegerValueIsAtMaxValid_413()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify range-restricted signed 8-bit integer value is at max valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("range_restricted_int8s", actualValue, 50));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMiddleValidValueToARangeRestrictedSigned8BitInteger_414()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt8sArgument;
        rangeRestrictedInt8sArgument = [NSNumber numberWithChar:6];
        [cluster writeAttributeRangeRestrictedInt8sWithValue:rangeRestrictedInt8sArgument
                                                  completion:^(NSError * _Nullable err) {
                                                      NSLog(@"Write middle valid value to a range-restricted signed 8-bit integer "
                                                            @"Error: %@",
                                                          err);

                                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                      NextTest();
                                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyRangeRestrictedSigned8BitIntegerValueIsAtMidValid_415()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify range-restricted signed 8-bit integer value is at mid valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("range_restricted_int8s", actualValue, 6));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadRangeRestrictedSigned16BitInteger_416()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read range-restricted signed 16-bit integer Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("range_restricted_int16s", actualValue, -100));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMinValueToARangeRestrictedSigned16BitInteger_417()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt16sArgument;
        rangeRestrictedInt16sArgument = [NSNumber numberWithShort:-32768];
        [cluster
            writeAttributeRangeRestrictedInt16sWithValue:rangeRestrictedInt16sArgument
                                              completion:^(NSError * _Nullable err) {
                                                  NSLog(@"Write min value to a range-restricted signed 16-bit integer Error: %@",
                                                      err);

                                                  VerifyOrReturn(CheckValue("status",
                                                      err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                              ? err.code
                                                              : EMBER_ZCL_STATUS_FAILURE)
                                                          : 0,
                                                      EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteJustBelowRangeValueToARangeRestrictedSigned16BitInteger_418()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt16sArgument;
        rangeRestrictedInt16sArgument = [NSNumber numberWithShort:-151];
        [cluster writeAttributeRangeRestrictedInt16sWithValue:rangeRestrictedInt16sArgument
                                                   completion:^(NSError * _Nullable err) {
                                                       NSLog(@"Write just-below-range value to a range-restricted signed 16-bit "
                                                             @"integer Error: %@",
                                                           err);

                                                       VerifyOrReturn(CheckValue("status",
                                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                   ? err.code
                                                                   : EMBER_ZCL_STATUS_FAILURE)
                                                               : 0,
                                                           EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                       NextTest();
                                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteJustAboveRangeValueToARangeRestrictedSigned16BitInteger_419()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt16sArgument;
        rangeRestrictedInt16sArgument = [NSNumber numberWithShort:201];
        [cluster writeAttributeRangeRestrictedInt16sWithValue:rangeRestrictedInt16sArgument
                                                   completion:^(NSError * _Nullable err) {
                                                       NSLog(@"Write just-above-range value to a range-restricted signed 16-bit "
                                                             @"integer Error: %@",
                                                           err);

                                                       VerifyOrReturn(CheckValue("status",
                                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                   ? err.code
                                                                   : EMBER_ZCL_STATUS_FAILURE)
                                                               : 0,
                                                           EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                       NextTest();
                                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMaxValueToARangeRestrictedSigned16BitInteger_420()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt16sArgument;
        rangeRestrictedInt16sArgument = [NSNumber numberWithShort:32767];
        [cluster
            writeAttributeRangeRestrictedInt16sWithValue:rangeRestrictedInt16sArgument
                                              completion:^(NSError * _Nullable err) {
                                                  NSLog(@"Write max value to a range-restricted signed 16-bit integer Error: %@",
                                                      err);

                                                  VerifyOrReturn(CheckValue("status",
                                                      err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                              ? err.code
                                                              : EMBER_ZCL_STATUS_FAILURE)
                                                          : 0,
                                                      EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyRangeRestrictedSigned16BitIntegerValueHasNotChanged_421()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify range-restricted signed 16-bit integer value has not changed Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("range_restricted_int16s", actualValue, -100));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMinValidValueToARangeRestrictedSigned16BitInteger_422()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt16sArgument;
        rangeRestrictedInt16sArgument = [NSNumber numberWithShort:-150];
        [cluster writeAttributeRangeRestrictedInt16sWithValue:rangeRestrictedInt16sArgument
                                                   completion:^(NSError * _Nullable err) {
                                                       NSLog(@"Write min valid value to a range-restricted signed 16-bit integer "
                                                             @"Error: %@",
                                                           err);

                                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                       NextTest();
                                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyRangeRestrictedSigned16BitIntegerValueIsAtMinValid_423()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify range-restricted signed 16-bit integer value is at min valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("range_restricted_int16s", actualValue, -150));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMaxValidValueToARangeRestrictedSigned16BitInteger_424()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt16sArgument;
        rangeRestrictedInt16sArgument = [NSNumber numberWithShort:200];
        [cluster writeAttributeRangeRestrictedInt16sWithValue:rangeRestrictedInt16sArgument
                                                   completion:^(NSError * _Nullable err) {
                                                       NSLog(@"Write max valid value to a range-restricted signed 16-bit integer "
                                                             @"Error: %@",
                                                           err);

                                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                       NextTest();
                                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyRangeRestrictedSigned16BitIntegerValueIsAtMaxValid_425()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify range-restricted signed 16-bit integer value is at max valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("range_restricted_int16s", actualValue, 200));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMiddleValidValueToARangeRestrictedSigned16BitInteger_426()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt16sArgument;
        rangeRestrictedInt16sArgument = [NSNumber numberWithShort:7];
        [cluster writeAttributeRangeRestrictedInt16sWithValue:rangeRestrictedInt16sArgument
                                                   completion:^(NSError * _Nullable err) {
                                                       NSLog(@"Write middle valid value to a range-restricted signed 16-bit "
                                                             @"integer Error: %@",
                                                           err);

                                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                       NextTest();
                                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyRangeRestrictedSigned16BitIntegerValueIsAtMidValid_427()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify range-restricted signed 16-bit integer value is at mid valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("range_restricted_int16s", actualValue, 7));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadNullableRangeRestrictedUnsigned8BitInteger_428()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read nullable range-restricted unsigned 8-bit integer Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_range_restricted_int8u", actualValue));
                VerifyOrReturn(CheckValue("nullable_range_restricted_int8u", actualValue, 70U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMinValueToANullableRangeRestrictedUnsigned8BitInteger_429()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8uArgument;
        nullableRangeRestrictedInt8uArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeNullableRangeRestrictedInt8uWithValue:nullableRangeRestrictedInt8uArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"Write min value to a nullable range-restricted unsigned "
                                                                    @"8-bit integer Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status",
                                                                  err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                          ? err.code
                                                                          : EMBER_ZCL_STATUS_FAILURE)
                                                                      : 0,
                                                                  EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteJustBelowRangeValueToANullableRangeRestrictedUnsigned8BitInteger_430()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8uArgument;
        nullableRangeRestrictedInt8uArgument = [NSNumber numberWithUnsignedChar:19U];
        [cluster writeAttributeNullableRangeRestrictedInt8uWithValue:nullableRangeRestrictedInt8uArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"Write just-below-range value to a nullable range-restricted "
                                                                    @"unsigned 8-bit integer Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status",
                                                                  err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                          ? err.code
                                                                          : EMBER_ZCL_STATUS_FAILURE)
                                                                      : 0,
                                                                  EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteJustAboveRangeValueToANullableRangeRestrictedUnsigned8BitInteger_431()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8uArgument;
        nullableRangeRestrictedInt8uArgument = [NSNumber numberWithUnsignedChar:101U];
        [cluster writeAttributeNullableRangeRestrictedInt8uWithValue:nullableRangeRestrictedInt8uArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"Write just-above-range value to a nullable range-restricted "
                                                                    @"unsigned 8-bit integer Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status",
                                                                  err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                          ? err.code
                                                                          : EMBER_ZCL_STATUS_FAILURE)
                                                                      : 0,
                                                                  EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMaxValueToANullableRangeRestrictedUnsigned8BitInteger_432()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8uArgument;
        nullableRangeRestrictedInt8uArgument = [NSNumber numberWithUnsignedChar:254U];
        [cluster writeAttributeNullableRangeRestrictedInt8uWithValue:nullableRangeRestrictedInt8uArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"Write max value to a nullable range-restricted unsigned "
                                                                    @"8-bit integer Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status",
                                                                  err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                          ? err.code
                                                                          : EMBER_ZCL_STATUS_FAILURE)
                                                                      : 0,
                                                                  EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyNullableRangeRestrictedUnsigned8BitIntegerValueHasNotChanged_433()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify nullable range-restricted unsigned 8-bit integer value has not changed Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_range_restricted_int8u", actualValue));
                VerifyOrReturn(CheckValue("nullable_range_restricted_int8u", actualValue, 70U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMinValidValueToANullableRangeRestrictedUnsigned8BitInteger_434()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8uArgument;
        nullableRangeRestrictedInt8uArgument = [NSNumber numberWithUnsignedChar:20U];
        [cluster writeAttributeNullableRangeRestrictedInt8uWithValue:nullableRangeRestrictedInt8uArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"Write min valid value to a nullable range-restricted "
                                                                    @"unsigned 8-bit integer Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyNullableRangeRestrictedUnsigned8BitIntegerValueIsAtMinValid_435()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify nullable range-restricted unsigned 8-bit integer value is at min valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_range_restricted_int8u", actualValue));
                VerifyOrReturn(CheckValue("nullable_range_restricted_int8u", actualValue, 20U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMaxValidValueToANullableRangeRestrictedUnsigned8BitInteger_436()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8uArgument;
        nullableRangeRestrictedInt8uArgument = [NSNumber numberWithUnsignedChar:100U];
        [cluster writeAttributeNullableRangeRestrictedInt8uWithValue:nullableRangeRestrictedInt8uArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"Write max valid value to a nullable range-restricted "
                                                                    @"unsigned 8-bit integer Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyNullableRangeRestrictedUnsigned8BitIntegerValueIsAtMaxValid_437()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify nullable range-restricted unsigned 8-bit integer value is at max valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_range_restricted_int8u", actualValue));
                VerifyOrReturn(CheckValue("nullable_range_restricted_int8u", actualValue, 100U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMiddleValidValueToANullableRangeRestrictedUnsigned8BitInteger_438()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8uArgument;
        nullableRangeRestrictedInt8uArgument = [NSNumber numberWithUnsignedChar:50U];
        [cluster writeAttributeNullableRangeRestrictedInt8uWithValue:nullableRangeRestrictedInt8uArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"Write middle valid value to a nullable range-restricted "
                                                                    @"unsigned 8-bit integer Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyNullableRangeRestrictedUnsigned8BitIntegerValueIsAtMidValid_439()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify nullable range-restricted unsigned 8-bit integer value is at mid valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_range_restricted_int8u", actualValue));
                VerifyOrReturn(CheckValue("nullable_range_restricted_int8u", actualValue, 50U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteNullValueToANullableRangeRestrictedUnsigned8BitInteger_440()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8uArgument;
        nullableRangeRestrictedInt8uArgument = nil;
        [cluster writeAttributeNullableRangeRestrictedInt8uWithValue:nullableRangeRestrictedInt8uArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"Write null value to a nullable range-restricted unsigned "
                                                                    @"8-bit integer Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyNullableRangeRestrictedUnsigned8BitIntegerValueIsNull_441()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify nullable range-restricted unsigned 8-bit integer value is null Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_range_restricted_int8u", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadNullableRangeRestrictedUnsigned16BitInteger_442()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read nullable range-restricted unsigned 16-bit integer Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_range_restricted_int16u", actualValue));
                VerifyOrReturn(CheckValue("nullable_range_restricted_int16u", actualValue, 200U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMinValueToANullableRangeRestrictedUnsigned16BitInteger_443()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16uArgument;
        nullableRangeRestrictedInt16uArgument = [NSNumber numberWithUnsignedShort:0U];
        [cluster writeAttributeNullableRangeRestrictedInt16uWithValue:nullableRangeRestrictedInt16uArgument
                                                           completion:^(NSError * _Nullable err) {
                                                               NSLog(@"Write min value to a nullable range-restricted unsigned "
                                                                     @"16-bit integer Error: %@",
                                                                   err);

                                                               VerifyOrReturn(CheckValue("status",
                                                                   err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                           ? err.code
                                                                           : EMBER_ZCL_STATUS_FAILURE)
                                                                       : 0,
                                                                   EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                               NextTest();
                                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteJustBelowRangeValueToANullableRangeRestrictedUnsigned16BitInteger_444()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16uArgument;
        nullableRangeRestrictedInt16uArgument = [NSNumber numberWithUnsignedShort:99U];
        [cluster writeAttributeNullableRangeRestrictedInt16uWithValue:nullableRangeRestrictedInt16uArgument
                                                           completion:^(NSError * _Nullable err) {
                                                               NSLog(@"Write just-below-range value to a nullable range-restricted "
                                                                     @"unsigned 16-bit integer Error: %@",
                                                                   err);

                                                               VerifyOrReturn(CheckValue("status",
                                                                   err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                           ? err.code
                                                                           : EMBER_ZCL_STATUS_FAILURE)
                                                                       : 0,
                                                                   EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                               NextTest();
                                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteJustAboveRangeValueToANullableRangeRestrictedUnsigned16BitInteger_445()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16uArgument;
        nullableRangeRestrictedInt16uArgument = [NSNumber numberWithUnsignedShort:1001U];
        [cluster writeAttributeNullableRangeRestrictedInt16uWithValue:nullableRangeRestrictedInt16uArgument
                                                           completion:^(NSError * _Nullable err) {
                                                               NSLog(@"Write just-above-range value to a nullable range-restricted "
                                                                     @"unsigned 16-bit integer Error: %@",
                                                                   err);

                                                               VerifyOrReturn(CheckValue("status",
                                                                   err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                           ? err.code
                                                                           : EMBER_ZCL_STATUS_FAILURE)
                                                                       : 0,
                                                                   EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                               NextTest();
                                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMaxValueToANullableRangeRestrictedUnsigned16BitInteger_446()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16uArgument;
        nullableRangeRestrictedInt16uArgument = [NSNumber numberWithUnsignedShort:65534U];
        [cluster writeAttributeNullableRangeRestrictedInt16uWithValue:nullableRangeRestrictedInt16uArgument
                                                           completion:^(NSError * _Nullable err) {
                                                               NSLog(@"Write max value to a nullable range-restricted unsigned "
                                                                     @"16-bit integer Error: %@",
                                                                   err);

                                                               VerifyOrReturn(CheckValue("status",
                                                                   err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                           ? err.code
                                                                           : EMBER_ZCL_STATUS_FAILURE)
                                                                       : 0,
                                                                   EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                               NextTest();
                                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyNullableRangeRestrictedUnsigned16BitIntegerValueHasNotChanged_447()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify nullable range-restricted unsigned 16-bit integer value has not changed Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_range_restricted_int16u", actualValue));
                VerifyOrReturn(CheckValue("nullable_range_restricted_int16u", actualValue, 200U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMinValidValueToANullableRangeRestrictedUnsigned16BitInteger_448()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16uArgument;
        nullableRangeRestrictedInt16uArgument = [NSNumber numberWithUnsignedShort:100U];
        [cluster writeAttributeNullableRangeRestrictedInt16uWithValue:nullableRangeRestrictedInt16uArgument
                                                           completion:^(NSError * _Nullable err) {
                                                               NSLog(@"Write min valid value to a nullable range-restricted "
                                                                     @"unsigned 16-bit integer Error: %@",
                                                                   err);

                                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                               NextTest();
                                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyNullableRangeRestrictedUnsigned16BitIntegerValueIsAtMinValid_449()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify nullable range-restricted unsigned 16-bit integer value is at min valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_range_restricted_int16u", actualValue));
                VerifyOrReturn(CheckValue("nullable_range_restricted_int16u", actualValue, 100U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMaxValidValueToANullableRangeRestrictedUnsigned16BitInteger_450()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16uArgument;
        nullableRangeRestrictedInt16uArgument = [NSNumber numberWithUnsignedShort:1000U];
        [cluster writeAttributeNullableRangeRestrictedInt16uWithValue:nullableRangeRestrictedInt16uArgument
                                                           completion:^(NSError * _Nullable err) {
                                                               NSLog(@"Write max valid value to a nullable range-restricted "
                                                                     @"unsigned 16-bit integer Error: %@",
                                                                   err);

                                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                               NextTest();
                                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyNullableRangeRestrictedUnsigned16BitIntegerValueIsAtMaxValid_451()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify nullable range-restricted unsigned 16-bit integer value is at max valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_range_restricted_int16u", actualValue));
                VerifyOrReturn(CheckValue("nullable_range_restricted_int16u", actualValue, 1000U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMiddleValidValueToANullableRangeRestrictedUnsigned16BitInteger_452()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16uArgument;
        nullableRangeRestrictedInt16uArgument = [NSNumber numberWithUnsignedShort:500U];
        [cluster writeAttributeNullableRangeRestrictedInt16uWithValue:nullableRangeRestrictedInt16uArgument
                                                           completion:^(NSError * _Nullable err) {
                                                               NSLog(@"Write middle valid value to a nullable range-restricted "
                                                                     @"unsigned 16-bit integer Error: %@",
                                                                   err);

                                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                               NextTest();
                                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyNullableRangeRestrictedUnsigned16BitIntegerValueIsAtMidValid_453()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify nullable range-restricted unsigned 16-bit integer value is at mid valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_range_restricted_int16u", actualValue));
                VerifyOrReturn(CheckValue("nullable_range_restricted_int16u", actualValue, 500U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteNullValueToANullableRangeRestrictedUnsigned16BitInteger_454()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16uArgument;
        nullableRangeRestrictedInt16uArgument = nil;
        [cluster writeAttributeNullableRangeRestrictedInt16uWithValue:nullableRangeRestrictedInt16uArgument
                                                           completion:^(NSError * _Nullable err) {
                                                               NSLog(@"Write null value to a nullable range-restricted unsigned "
                                                                     @"16-bit integer Error: %@",
                                                                   err);

                                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                               NextTest();
                                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyNullableRangeRestrictedUnsigned16BitIntegerValueIsNull_455()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify nullable range-restricted unsigned 16-bit integer value is null Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_range_restricted_int16u", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadNullableRangeRestrictedSigned8BitInteger_456()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read nullable range-restricted signed 8-bit integer Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_range_restricted_int8s", actualValue));
                VerifyOrReturn(CheckValue("nullable_range_restricted_int8s", actualValue, -20));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMinValueToANullableRangeRestrictedSigned8BitInteger_457()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8sArgument;
        nullableRangeRestrictedInt8sArgument = [NSNumber numberWithChar:-127];
        [cluster writeAttributeNullableRangeRestrictedInt8sWithValue:nullableRangeRestrictedInt8sArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"Write min value to a nullable range-restricted signed 8-bit "
                                                                    @"integer Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status",
                                                                  err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                          ? err.code
                                                                          : EMBER_ZCL_STATUS_FAILURE)
                                                                      : 0,
                                                                  EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteJustBelowRangeValueToANullableRangeRestrictedSigned8BitInteger_458()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8sArgument;
        nullableRangeRestrictedInt8sArgument = [NSNumber numberWithChar:-41];
        [cluster writeAttributeNullableRangeRestrictedInt8sWithValue:nullableRangeRestrictedInt8sArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"Write just-below-range value to a nullable range-restricted "
                                                                    @"signed 8-bit integer Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status",
                                                                  err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                          ? err.code
                                                                          : EMBER_ZCL_STATUS_FAILURE)
                                                                      : 0,
                                                                  EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteJustAboveRangeValueToANullableRangeRestrictedSigned8BitInteger_459()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8sArgument;
        nullableRangeRestrictedInt8sArgument = [NSNumber numberWithChar:51];
        [cluster writeAttributeNullableRangeRestrictedInt8sWithValue:nullableRangeRestrictedInt8sArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"Write just-above-range value to a nullable range-restricted "
                                                                    @"signed 8-bit integer Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status",
                                                                  err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                          ? err.code
                                                                          : EMBER_ZCL_STATUS_FAILURE)
                                                                      : 0,
                                                                  EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMaxValueToANullableRangeRestrictedSigned8BitInteger_460()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8sArgument;
        nullableRangeRestrictedInt8sArgument = [NSNumber numberWithChar:127];
        [cluster writeAttributeNullableRangeRestrictedInt8sWithValue:nullableRangeRestrictedInt8sArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"Write max value to a nullable range-restricted signed 8-bit "
                                                                    @"integer Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status",
                                                                  err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                          ? err.code
                                                                          : EMBER_ZCL_STATUS_FAILURE)
                                                                      : 0,
                                                                  EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyNullableRangeRestrictedSigned8BitIntegerValueHasNotChanged_461()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify nullable range-restricted signed 8-bit integer value has not changed Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_range_restricted_int8s", actualValue));
                VerifyOrReturn(CheckValue("nullable_range_restricted_int8s", actualValue, -20));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMinValidValueToANullableRangeRestrictedSigned8BitInteger_462()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8sArgument;
        nullableRangeRestrictedInt8sArgument = [NSNumber numberWithChar:-40];
        [cluster writeAttributeNullableRangeRestrictedInt8sWithValue:nullableRangeRestrictedInt8sArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"Write min valid value to a nullable range-restricted signed "
                                                                    @"8-bit integer Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyNullableRangeRestrictedSigned8BitIntegerValueIsAtMinValid_463()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify nullable range-restricted signed 8-bit integer value is at min valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_range_restricted_int8s", actualValue));
                VerifyOrReturn(CheckValue("nullable_range_restricted_int8s", actualValue, -40));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMaxValidValueToANullableRangeRestrictedSigned8BitInteger_464()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8sArgument;
        nullableRangeRestrictedInt8sArgument = [NSNumber numberWithChar:50];
        [cluster writeAttributeNullableRangeRestrictedInt8sWithValue:nullableRangeRestrictedInt8sArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"Write max valid value to a nullable range-restricted signed "
                                                                    @"8-bit integer Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyNullableRangeRestrictedSigned8BitIntegerValueIsAtMaxValid_465()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify nullable range-restricted signed 8-bit integer value is at max valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_range_restricted_int8s", actualValue));
                VerifyOrReturn(CheckValue("nullable_range_restricted_int8s", actualValue, 50));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMiddleValidValueToANullableRangeRestrictedSigned8BitInteger_466()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8sArgument;
        nullableRangeRestrictedInt8sArgument = [NSNumber numberWithChar:6];
        [cluster writeAttributeNullableRangeRestrictedInt8sWithValue:nullableRangeRestrictedInt8sArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"Write middle valid value to a nullable range-restricted "
                                                                    @"signed 8-bit integer Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyNullableRangeRestrictedSigned8BitIntegerValueIsAtMidValid_467()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify nullable range-restricted signed 8-bit integer value is at mid valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_range_restricted_int8s", actualValue));
                VerifyOrReturn(CheckValue("nullable_range_restricted_int8s", actualValue, 6));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteNullValueToANullableRangeRestrictedSigned8BitInteger_468()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8sArgument;
        nullableRangeRestrictedInt8sArgument = nil;
        [cluster writeAttributeNullableRangeRestrictedInt8sWithValue:nullableRangeRestrictedInt8sArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"Write null value to a nullable range-restricted signed 8-bit "
                                                                    @"integer Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyNullableRangeRestrictedSigned8BitIntegerValueIsAtNull_469()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify nullable range-restricted signed 8-bit integer value is at null Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_range_restricted_int8s", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadNullableRangeRestrictedSigned16BitInteger_470()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read nullable range-restricted signed 16-bit integer Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_range_restricted_int16s", actualValue));
                VerifyOrReturn(CheckValue("nullable_range_restricted_int16s", actualValue, -100));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMinValueToANullableRangeRestrictedSigned16BitInteger_471()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16sArgument;
        nullableRangeRestrictedInt16sArgument = [NSNumber numberWithShort:-32767];
        [cluster writeAttributeNullableRangeRestrictedInt16sWithValue:nullableRangeRestrictedInt16sArgument
                                                           completion:^(NSError * _Nullable err) {
                                                               NSLog(@"Write min value to a nullable range-restricted signed "
                                                                     @"16-bit integer Error: %@",
                                                                   err);

                                                               VerifyOrReturn(CheckValue("status",
                                                                   err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                           ? err.code
                                                                           : EMBER_ZCL_STATUS_FAILURE)
                                                                       : 0,
                                                                   EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                               NextTest();
                                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteJustBelowRangeValueToANullableRangeRestrictedSigned16BitInteger_472()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16sArgument;
        nullableRangeRestrictedInt16sArgument = [NSNumber numberWithShort:-151];
        [cluster writeAttributeNullableRangeRestrictedInt16sWithValue:nullableRangeRestrictedInt16sArgument
                                                           completion:^(NSError * _Nullable err) {
                                                               NSLog(@"Write just-below-range value to a nullable range-restricted "
                                                                     @"signed 16-bit integer Error: %@",
                                                                   err);

                                                               VerifyOrReturn(CheckValue("status",
                                                                   err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                           ? err.code
                                                                           : EMBER_ZCL_STATUS_FAILURE)
                                                                       : 0,
                                                                   EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                               NextTest();
                                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteJustAboveRangeValueToANullableRangeRestrictedSigned16BitInteger_473()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16sArgument;
        nullableRangeRestrictedInt16sArgument = [NSNumber numberWithShort:201];
        [cluster writeAttributeNullableRangeRestrictedInt16sWithValue:nullableRangeRestrictedInt16sArgument
                                                           completion:^(NSError * _Nullable err) {
                                                               NSLog(@"Write just-above-range value to a nullable range-restricted "
                                                                     @"signed 16-bit integer Error: %@",
                                                                   err);

                                                               VerifyOrReturn(CheckValue("status",
                                                                   err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                           ? err.code
                                                                           : EMBER_ZCL_STATUS_FAILURE)
                                                                       : 0,
                                                                   EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                               NextTest();
                                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMaxValueToANullableRangeRestrictedSigned16BitInteger_474()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16sArgument;
        nullableRangeRestrictedInt16sArgument = [NSNumber numberWithShort:32767];
        [cluster writeAttributeNullableRangeRestrictedInt16sWithValue:nullableRangeRestrictedInt16sArgument
                                                           completion:^(NSError * _Nullable err) {
                                                               NSLog(@"Write max value to a nullable range-restricted signed "
                                                                     @"16-bit integer Error: %@",
                                                                   err);

                                                               VerifyOrReturn(CheckValue("status",
                                                                   err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                           ? err.code
                                                                           : EMBER_ZCL_STATUS_FAILURE)
                                                                       : 0,
                                                                   EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                                               NextTest();
                                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyNullableRangeRestrictedSigned16BitIntegerValueHasNotChanged_475()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify nullable range-restricted signed 16-bit integer value has not changed Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_range_restricted_int16s", actualValue));
                VerifyOrReturn(CheckValue("nullable_range_restricted_int16s", actualValue, -100));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMinValidValueToANullableRangeRestrictedSigned16BitInteger_476()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16sArgument;
        nullableRangeRestrictedInt16sArgument = [NSNumber numberWithShort:-150];
        [cluster writeAttributeNullableRangeRestrictedInt16sWithValue:nullableRangeRestrictedInt16sArgument
                                                           completion:^(NSError * _Nullable err) {
                                                               NSLog(@"Write min valid value to a nullable range-restricted signed "
                                                                     @"16-bit integer Error: %@",
                                                                   err);

                                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                               NextTest();
                                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyNullableRangeRestrictedSigned16BitIntegerValueIsAtMinValid_477()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify nullable range-restricted signed 16-bit integer value is at min valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_range_restricted_int16s", actualValue));
                VerifyOrReturn(CheckValue("nullable_range_restricted_int16s", actualValue, -150));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMaxValidValueToANullableRangeRestrictedSigned16BitInteger_478()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16sArgument;
        nullableRangeRestrictedInt16sArgument = [NSNumber numberWithShort:200];
        [cluster writeAttributeNullableRangeRestrictedInt16sWithValue:nullableRangeRestrictedInt16sArgument
                                                           completion:^(NSError * _Nullable err) {
                                                               NSLog(@"Write max valid value to a nullable range-restricted signed "
                                                                     @"16-bit integer Error: %@",
                                                                   err);

                                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                               NextTest();
                                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyNullableRangeRestrictedSigned16BitIntegerValueIsAtMaxValid_479()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify nullable range-restricted signed 16-bit integer value is at max valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_range_restricted_int16s", actualValue));
                VerifyOrReturn(CheckValue("nullable_range_restricted_int16s", actualValue, 200));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteMiddleValidValueToANullableRangeRestrictedSigned16BitInteger_480()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16sArgument;
        nullableRangeRestrictedInt16sArgument = [NSNumber numberWithShort:7];
        [cluster writeAttributeNullableRangeRestrictedInt16sWithValue:nullableRangeRestrictedInt16sArgument
                                                           completion:^(NSError * _Nullable err) {
                                                               NSLog(@"Write middle valid value to a nullable range-restricted "
                                                                     @"signed 16-bit integer Error: %@",
                                                                   err);

                                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                               NextTest();
                                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyNullableRangeRestrictedSigned16BitIntegerValueIsAtMidValid_481()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify nullable range-restricted signed 16-bit integer value is at mid valid Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("nullable_range_restricted_int16s", actualValue));
                VerifyOrReturn(CheckValue("nullable_range_restricted_int16s", actualValue, 7));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteNullValueToANullableRangeRestrictedSigned16BitInteger_482()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16sArgument;
        nullableRangeRestrictedInt16sArgument = nil;
        [cluster writeAttributeNullableRangeRestrictedInt16sWithValue:nullableRangeRestrictedInt16sArgument
                                                           completion:^(NSError * _Nullable err) {
                                                               NSLog(@"Write null value to a nullable range-restricted signed "
                                                                     @"16-bit integer Error: %@",
                                                                   err);

                                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                               NextTest();
                                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyNullableRangeRestrictedSigned16BitIntegerValueIsNull_483()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableRangeRestrictedInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify nullable range-restricted signed 16-bit integer value is null Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("nullable_range_restricted_int16s", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeThatReturnsGeneralStatusOnWrite_484()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id generalErrorBooleanArgument;
        generalErrorBooleanArgument = [NSNumber numberWithBool:false];
        [cluster writeAttributeGeneralErrorBooleanWithValue:generalErrorBooleanArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"Write attribute that returns general status on write Error: %@", err);

                                                     VerifyOrReturn(CheckValue("status",
                                                         err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                 ? err.code
                                                                 : EMBER_ZCL_STATUS_FAILURE)
                                                             : 0,
                                                         EMBER_ZCL_STATUS_INVALID_DATA_TYPE));
                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeThatReturnsClusterSpecificStatusOnWrite_485()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id clusterErrorBooleanArgument;
        clusterErrorBooleanArgument = [NSNumber numberWithBool:false];
        [cluster
            writeAttributeClusterErrorBooleanWithValue:clusterErrorBooleanArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write attribute that returns cluster-specific status on write Error: %@",
                                                    err);

                                                VerifyOrReturn(CheckValue("status",
                                                    err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                            ? err.code
                                                            : EMBER_ZCL_STATUS_FAILURE)
                                                        : 0,
                                                    EMBER_ZCL_STATUS_FAILURE));
                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeThatReturnsGeneralStatusOnRead_486()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneralErrorBooleanWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute that returns general status on read Error: %@", err);

            VerifyOrReturn(CheckValue("status",
                err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE) : 0,
                EMBER_ZCL_STATUS_INVALID_DATA_TYPE));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeThatReturnsClusterSpecificStatusOnRead_487()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterErrorBooleanWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"read attribute that returns cluster-specific status on read Error: %@", err);

            VerifyOrReturn(CheckValue("status",
                err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE) : 0,
                EMBER_ZCL_STATUS_FAILURE));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAcceptedCommandListAttribute_488()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"read AcceptedCommandList attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(18)));
                VerifyOrReturn(CheckValue("", actualValue[0], 0UL));
                VerifyOrReturn(CheckValue("", actualValue[1], 1UL));
                VerifyOrReturn(CheckValue("", actualValue[2], 2UL));
                VerifyOrReturn(CheckValue("", actualValue[3], 4UL));
                VerifyOrReturn(CheckValue("", actualValue[4], 7UL));
                VerifyOrReturn(CheckValue("", actualValue[5], 8UL));
                VerifyOrReturn(CheckValue("", actualValue[6], 9UL));
                VerifyOrReturn(CheckValue("", actualValue[7], 10UL));
                VerifyOrReturn(CheckValue("", actualValue[8], 11UL));
                VerifyOrReturn(CheckValue("", actualValue[9], 12UL));
                VerifyOrReturn(CheckValue("", actualValue[10], 13UL));
                VerifyOrReturn(CheckValue("", actualValue[11], 14UL));
                VerifyOrReturn(CheckValue("", actualValue[12], 15UL));
                VerifyOrReturn(CheckValue("", actualValue[13], 17UL));
                VerifyOrReturn(CheckValue("", actualValue[14], 18UL));
                VerifyOrReturn(CheckValue("", actualValue[15], 19UL));
                VerifyOrReturn(CheckValue("", actualValue[16], 20UL));
                VerifyOrReturn(CheckValue("", actualValue[17], 21UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadGeneratedCommandListAttribute_489()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"read GeneratedCommandList attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(9)));
                VerifyOrReturn(CheckValue("", actualValue[0], 0UL));
                VerifyOrReturn(CheckValue("", actualValue[1], 1UL));
                VerifyOrReturn(CheckValue("", actualValue[2], 4UL));
                VerifyOrReturn(CheckValue("", actualValue[3], 5UL));
                VerifyOrReturn(CheckValue("", actualValue[4], 6UL));
                VerifyOrReturn(CheckValue("", actualValue[5], 8UL));
                VerifyOrReturn(CheckValue("", actualValue[6], 9UL));
                VerifyOrReturn(CheckValue("", actualValue[7], 10UL));
                VerifyOrReturn(CheckValue("", actualValue[8], 11UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteStructTypedAttribute_490()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id structAttrArgument;
        structAttrArgument = [[MTRUnitTestingClusterSimpleStruct alloc] init];
        ((MTRUnitTestingClusterSimpleStruct *) structAttrArgument).a = [NSNumber numberWithUnsignedChar:5U];
        ((MTRUnitTestingClusterSimpleStruct *) structAttrArgument).b = [NSNumber numberWithBool:true];
        ((MTRUnitTestingClusterSimpleStruct *) structAttrArgument).c = [NSNumber numberWithUnsignedChar:2U];
        ((MTRUnitTestingClusterSimpleStruct *) structAttrArgument).d = [[NSData alloc] initWithBytes:"abc" length:3];
        ((MTRUnitTestingClusterSimpleStruct *) structAttrArgument).e = @"";
        ((MTRUnitTestingClusterSimpleStruct *) structAttrArgument).f = [NSNumber numberWithUnsignedChar:17U];
        ((MTRUnitTestingClusterSimpleStruct *) structAttrArgument).g = [NSNumber numberWithFloat:1.5f];
        ((MTRUnitTestingClusterSimpleStruct *) structAttrArgument).h = [NSNumber numberWithDouble:3.14159265358979];

        [cluster writeAttributeStructAttrWithValue:structAttrArgument
                                        completion:^(NSError * _Nullable err) {
                                            NSLog(@"Write struct-typed attribute Error: %@", err);

                                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                            NextTest();
                                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadStructTypedAttribute_491()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeStructAttrWithCompletion:^(MTRUnitTestingClusterSimpleStruct * _Nullable value, NSError * _Nullable err) {
                NSLog(@"Read struct-typed attribute Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                {
                    id actualValue = value;
                    VerifyOrReturn(CheckValue("a", ((MTRUnitTestingClusterSimpleStruct *) actualValue).a, 5U));
                    VerifyOrReturn(CheckValue("b", ((MTRUnitTestingClusterSimpleStruct *) actualValue).b, true));
                    VerifyOrReturn(CheckValue("c", ((MTRUnitTestingClusterSimpleStruct *) actualValue).c, 2U));
                    VerifyOrReturn(CheckValueAsString(
                        "d", ((MTRUnitTestingClusterSimpleStruct *) actualValue).d, [[NSData alloc] initWithBytes:"abc" length:3]));
                    VerifyOrReturn(CheckValueAsString("e", ((MTRUnitTestingClusterSimpleStruct *) actualValue).e, @""));
                    VerifyOrReturn(CheckValue("f", ((MTRUnitTestingClusterSimpleStruct *) actualValue).f, 17U));
                    VerifyOrReturn(CheckValue("g", ((MTRUnitTestingClusterSimpleStruct *) actualValue).g, 1.5f));
                    VerifyOrReturn(CheckValue("h", ((MTRUnitTestingClusterSimpleStruct *) actualValue).h, 3.14159265358979));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }
};

class TestConstraints : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestConstraints()
        : TestCommandBridge("TestConstraints")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestConstraints() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestConstraints\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestConstraints\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Write attribute LIST With List of INT8U\n");
            err = TestWriteAttributeListWithListOfInt8u_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read attribute LIST With Partial List of INT8U that should be in it\n");
            err = TestReadAttributeListWithPartialListOfInt8uThatShouldBeInIt_2();
            break;
        case 3:
            ChipLogProgress(
                chipTool, " ***** Test Step 3 : Read attribute LIST With Partial List of INT8U that should not be included\n");
            err = TestReadAttributeListWithPartialListOfInt8uThatShouldNotBeIncluded_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Write attribute LIST Back to Default Value\n");
            err = TestWriteAttributeListBackToDefaultValue_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read attribute BITMAP32 Default Value\n");
            err = TestReadAttributeBitmap32DefaultValue_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Write attribute BITMAP32 with MaskVal1 and MaskVal3\n");
            err = TestWriteAttributeBitmap32WithMaskVal1AndMaskVal3_6();
            break;
        case 7:
            ChipLogProgress(chipTool,
                " ***** Test Step 7 : Read attribute BITMAP32 with MaskVal1 and MaskVal3 and ensure MaskVal2 is not set\n");
            err = TestReadAttributeBitmap32WithMaskVal1AndMaskVal3AndEnsureMaskVal2IsNotSet_7();
            break;
        case 8:
            ChipLogProgress(
                chipTool, " ***** Test Step 8 : Read attribute BITMAP32 with MaskVal1 and MaskVal3 and ensure MaskVal1 is set\n");
            err = TestReadAttributeBitmap32WithMaskVal1AndMaskVal3AndEnsureMaskVal1IsSet_8();
            break;
        case 9:
            ChipLogProgress(
                chipTool, " ***** Test Step 9 : Read attribute BITMAP32 with MaskVal1 and MaskVal3 and ensure MaskVal3 is set\n");
            err = TestReadAttributeBitmap32WithMaskVal1AndMaskVal3AndEnsureMaskVal3IsSet_9();
            break;
        case 10:
            ChipLogProgress(chipTool,
                " ***** Test Step 10 : Read attribute BITMAP32 with MaskVal1 and MaskVal3 and ensure Maskval1 and MaskVal3 are "
                "set\n");
            err = TestReadAttributeBitmap32WithMaskVal1AndMaskVal3AndEnsureMaskval1AndMaskVal3AreSet_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Write attribute BITMAP32 Back to Default Value\n");
            err = TestWriteAttributeBitmap32BackToDefaultValue_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Write attribute INT32U Value\n");
            err = TestWriteAttributeInt32uValue_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Read attribute INT32U Value MinValue Constraints\n");
            err = TestReadAttributeInt32uValueMinValueConstraints_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Read attribute INT32U Value MaxValue Constraints\n");
            err = TestReadAttributeInt32uValueMaxValueConstraints_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Read attribute INT32U Value NotValue Constraints\n");
            err = TestReadAttributeInt32uValueNotValueConstraints_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Write attribute INT32U Value Back to Default Value\n");
            err = TestWriteAttributeInt32uValueBackToDefaultValue_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Write attribute CHAR_STRING Value\n");
            err = TestWriteAttributeCharStringValue_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Read attribute CHAR_STRING Value MinLength Constraints\n");
            err = TestReadAttributeCharStringValueMinLengthConstraints_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Read attribute CHAR_STRING Value MaxLength Constraints\n");
            err = TestReadAttributeCharStringValueMaxLengthConstraints_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Read attribute CHAR_STRING Value StartsWith Constraints\n");
            err = TestReadAttributeCharStringValueStartsWithConstraints_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Read attribute CHAR_STRING Value EndsWith Constraints\n");
            err = TestReadAttributeCharStringValueEndsWithConstraints_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : Write attribute CHAR_STRING Value\n");
            err = TestWriteAttributeCharStringValue_22();
            break;
        case 23:
            ChipLogProgress(
                chipTool, " ***** Test Step 23 : Read attribute CHAR_STRING Value isLowerCase/isUpperCase Constraints\n");
            err = TestReadAttributeCharStringValueIsLowerCaseIsUpperCaseConstraints_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : Write attribute CHAR_STRING Value\n");
            err = TestWriteAttributeCharStringValue_24();
            break;
        case 25:
            ChipLogProgress(
                chipTool, " ***** Test Step 25 : Read attribute CHAR_STRING Value isLowerCase/isUpperCase Constraints\n");
            err = TestReadAttributeCharStringValueIsLowerCaseIsUpperCaseConstraints_25();
            break;
        case 26:
            ChipLogProgress(chipTool, " ***** Test Step 26 : Write attribute CHAR_STRING Value\n");
            err = TestWriteAttributeCharStringValue_26();
            break;
        case 27:
            ChipLogProgress(
                chipTool, " ***** Test Step 27 : Read attribute CHAR_STRING Value isLowerCase/isUpperCase Constraints\n");
            err = TestReadAttributeCharStringValueIsLowerCaseIsUpperCaseConstraints_27();
            break;
        case 28:
            ChipLogProgress(chipTool, " ***** Test Step 28 : Write attribute CHAR_STRING Value\n");
            err = TestWriteAttributeCharStringValue_28();
            break;
        case 29:
            ChipLogProgress(chipTool, " ***** Test Step 29 : Read attribute CHAR_STRING Value isHexString Constraints\n");
            err = TestReadAttributeCharStringValueIsHexStringConstraints_29();
            break;
        case 30:
            ChipLogProgress(chipTool, " ***** Test Step 30 : Write attribute CHAR_STRING Value\n");
            err = TestWriteAttributeCharStringValue_30();
            break;
        case 31:
            ChipLogProgress(chipTool, " ***** Test Step 31 : Read attribute CHAR_STRING Value isHexString Constraints\n");
            err = TestReadAttributeCharStringValueIsHexStringConstraints_31();
            break;
        case 32:
            ChipLogProgress(chipTool, " ***** Test Step 32 : Write attribute CHAR_STRING Value Back to Default Value\n");
            err = TestWriteAttributeCharStringValueBackToDefaultValue_32();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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));
            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));
            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));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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));
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 33;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestWriteAttributeListWithListOfInt8u_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id listInt8uArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [NSNumber numberWithUnsignedChar:1U];
            temp_0[1] = [NSNumber numberWithUnsignedChar:2U];
            temp_0[2] = [NSNumber numberWithUnsignedChar:3U];
            temp_0[3] = [NSNumber numberWithUnsignedChar:4U];
            listInt8uArgument = temp_0;
        }
        [cluster writeAttributeListInt8uWithValue:listInt8uArgument
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(@"Write attribute LIST With List of INT8U Error: %@", err);

                                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeListWithPartialListOfInt8uThatShouldBeInIt_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeListInt8uWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute LIST With Partial List of INT8U that should be in it Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintContains("listInt8u", value, 2U));
            VerifyOrReturn(CheckConstraintContains("listInt8u", value, 3U));
            VerifyOrReturn(CheckConstraintContains("listInt8u", value, 4U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeListWithPartialListOfInt8uThatShouldNotBeIncluded_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeListInt8uWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute LIST With Partial List of INT8U that should not be included Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintExcludes("listInt8u", value, 0U));
            VerifyOrReturn(CheckConstraintExcludes("listInt8u", value, 5U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeListBackToDefaultValue_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id listInt8uArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            listInt8uArgument = temp_0;
        }
        [cluster writeAttributeListInt8uWithValue:listInt8uArgument
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(@"Write attribute LIST Back to Default Value Error: %@", err);

                                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap32DefaultValue_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap32WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP32 Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap32", actualValue, 0UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeBitmap32WithMaskVal1AndMaskVal3_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap32Argument;
        bitmap32Argument = [NSNumber numberWithUnsignedInt:5UL];
        [cluster writeAttributeBitmap32WithValue:bitmap32Argument
                                      completion:^(NSError * _Nullable err) {
                                          NSLog(@"Write attribute BITMAP32 with MaskVal1 and MaskVal3 Error: %@", err);

                                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                          NextTest();
                                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap32WithMaskVal1AndMaskVal3AndEnsureMaskVal2IsNotSet_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap32WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP32 with MaskVal1 and MaskVal3 and ensure MaskVal2 is not set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap32", actualValue, 5UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap32WithMaskVal1AndMaskVal3AndEnsureMaskVal1IsSet_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap32WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP32 with MaskVal1 and MaskVal3 and ensure MaskVal1 is set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap32", actualValue, 5UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap32WithMaskVal1AndMaskVal3AndEnsureMaskVal3IsSet_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap32WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP32 with MaskVal1 and MaskVal3 and ensure MaskVal3 is set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap32", actualValue, 5UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap32WithMaskVal1AndMaskVal3AndEnsureMaskval1AndMaskVal3AreSet_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap32WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP32 with MaskVal1 and MaskVal3 and ensure Maskval1 and MaskVal3 are set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap32", actualValue, 5UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeBitmap32BackToDefaultValue_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap32Argument;
        bitmap32Argument = [NSNumber numberWithUnsignedInt:0UL];
        [cluster writeAttributeBitmap32WithValue:bitmap32Argument
                                      completion:^(NSError * _Nullable err) {
                                          NSLog(@"Write attribute BITMAP32 Back to Default Value Error: %@", err);

                                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                          NextTest();
                                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt32uValue_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int32uArgument;
        int32uArgument = [NSNumber numberWithUnsignedInt:5UL];
        [cluster writeAttributeInt32uWithValue:int32uArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT32U Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt32uValueMinValueConstraints_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT32U Value MinValue Constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint32_t>("int32u", [value unsignedIntValue], 5UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt32uValueMaxValueConstraints_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT32U Value MaxValue Constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("int32u", [value unsignedIntValue], 5UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt32uValueNotValueConstraints_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT32U Value NotValue Constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintNotValue("int32u", value, 6UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt32uValueBackToDefaultValue_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int32uArgument;
        int32uArgument = [NSNumber numberWithUnsignedInt:0UL];
        [cluster writeAttributeInt32uWithValue:int32uArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT32U Value Back to Default Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeCharStringValue_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id charStringArgument;
        charStringArgument = @"** Test **";
        [cluster writeAttributeCharStringWithValue:charStringArgument
                                        completion:^(NSError * _Nullable err) {
                                            NSLog(@"Write attribute CHAR_STRING Value Error: %@", err);

                                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                            NextTest();
                                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeCharStringValueMinLengthConstraints_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute CHAR_STRING Value MinLength Constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinLength("charString", value, 5));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeCharStringValueMaxLengthConstraints_19()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute CHAR_STRING Value MaxLength Constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMaxLength("charString", value, 20));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeCharStringValueStartsWithConstraints_20()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute CHAR_STRING Value StartsWith Constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintStartsWith("charString", value, "**"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeCharStringValueEndsWithConstraints_21()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute CHAR_STRING Value EndsWith Constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintEndsWith("charString", value, "**"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeCharStringValue_22()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id charStringArgument;
        charStringArgument = @"lowercase";
        [cluster writeAttributeCharStringWithValue:charStringArgument
                                        completion:^(NSError * _Nullable err) {
                                            NSLog(@"Write attribute CHAR_STRING Value Error: %@", err);

                                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                            NextTest();
                                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeCharStringValueIsLowerCaseIsUpperCaseConstraints_23()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute CHAR_STRING Value isLowerCase/isUpperCase Constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintIsUpperCase("charString", value, false));
            VerifyOrReturn(CheckConstraintIsLowerCase("charString", value, true));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeCharStringValue_24()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id charStringArgument;
        charStringArgument = @"UPPERCASE";
        [cluster writeAttributeCharStringWithValue:charStringArgument
                                        completion:^(NSError * _Nullable err) {
                                            NSLog(@"Write attribute CHAR_STRING Value Error: %@", err);

                                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                            NextTest();
                                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeCharStringValueIsLowerCaseIsUpperCaseConstraints_25()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute CHAR_STRING Value isLowerCase/isUpperCase Constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintIsUpperCase("charString", value, true));
            VerifyOrReturn(CheckConstraintIsLowerCase("charString", value, false));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeCharStringValue_26()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id charStringArgument;
        charStringArgument = @"lowUPPER";
        [cluster writeAttributeCharStringWithValue:charStringArgument
                                        completion:^(NSError * _Nullable err) {
                                            NSLog(@"Write attribute CHAR_STRING Value Error: %@", err);

                                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                            NextTest();
                                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeCharStringValueIsLowerCaseIsUpperCaseConstraints_27()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute CHAR_STRING Value isLowerCase/isUpperCase Constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintIsUpperCase("charString", value, false));
            VerifyOrReturn(CheckConstraintIsLowerCase("charString", value, false));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeCharStringValue_28()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id charStringArgument;
        charStringArgument = @"ABCDEF012V";
        [cluster writeAttributeCharStringWithValue:charStringArgument
                                        completion:^(NSError * _Nullable err) {
                                            NSLog(@"Write attribute CHAR_STRING Value Error: %@", err);

                                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                            NextTest();
                                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeCharStringValueIsHexStringConstraints_29()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute CHAR_STRING Value isHexString Constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintIsHexString("charString", value, false));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeCharStringValue_30()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id charStringArgument;
        charStringArgument = @"ABCDEF0123";
        [cluster writeAttributeCharStringWithValue:charStringArgument
                                        completion:^(NSError * _Nullable err) {
                                            NSLog(@"Write attribute CHAR_STRING Value Error: %@", err);

                                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                            NextTest();
                                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeCharStringValueIsHexStringConstraints_31()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute CHAR_STRING Value isHexString Constraints Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintIsHexString("charString", value, true));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeCharStringValueBackToDefaultValue_32()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id charStringArgument;
        charStringArgument = @"";
        [cluster writeAttributeCharStringWithValue:charStringArgument
                                        completion:^(NSError * _Nullable err) {
                                            NSLog(@"Write attribute CHAR_STRING Value Back to Default Value Error: %@", err);

                                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                            NextTest();
                                        }];

        return CHIP_NO_ERROR;
    }
};

class TestDelayCommands : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestDelayCommands()
        : TestCommandBridge("TestDelayCommands")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestDelayCommands() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestDelayCommands\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestDelayCommands\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Wait 100ms\n");
            err = TestWait100ms_1();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 2;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestWait100ms_1()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }
};

class TestLogCommands : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestLogCommands()
        : TestCommandBridge("TestLogCommands")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestLogCommands() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestLogCommands\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestLogCommands\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Log a simple message\n");
            err = TestLogASimpleMessage_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Do a simple user prompt message\n");
            err = TestDoASimpleUserPromptMessage_2();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 3;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestLogASimpleMessage_1()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestDoASimpleUserPromptMessage_2()
    {

        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("alpha", value);
    }
};

class TestSaveAs : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestSaveAs()
        : TestCommandBridge("TestSaveAs")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestSaveAs() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestSaveAs\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestSaveAs\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Send Test Add Arguments Command\n");
            err = TestSendTestAddArgumentsCommand_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Send Test Add Arguments Command\n");
            err = TestSendTestAddArgumentsCommand_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Send Test Add Arguments Command\n");
            err = TestSendTestAddArgumentsCommand_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read attribute BOOLEAN Default Value\n");
            err = TestReadAttributeBooleanDefaultValue_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Write attribute BOOLEAN Not Default Value\n");
            err = TestWriteAttributeBooleanNotDefaultValue_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read attribute BOOLEAN Not Default Value\n");
            err = TestReadAttributeBooleanNotDefaultValue_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Write attribute BOOLEAN DefaultValue\n");
            err = TestWriteAttributeBooleanDefaultValue_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read attribute BOOLEAN False\n");
            err = TestReadAttributeBooleanFalse_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Read attribute BITMAP8 Default Value\n");
            err = TestReadAttributeBitmap8DefaultValue_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Write attribute BITMAP8 Not Default Value\n");
            err = TestWriteAttributeBitmap8NotDefaultValue_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Read attribute BITMAP8 Not Default Value\n");
            err = TestReadAttributeBitmap8NotDefaultValue_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Write attribute BITMAP8 Default Value\n");
            err = TestWriteAttributeBitmap8DefaultValue_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Read attribute BITMAP8 Default Value\n");
            err = TestReadAttributeBitmap8DefaultValue_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Read attribute BITMAP16 Default Value\n");
            err = TestReadAttributeBitmap16DefaultValue_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Write attribute BITMAP16 Not Default Value\n");
            err = TestWriteAttributeBitmap16NotDefaultValue_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Read attribute BITMAP16 Not Default Value\n");
            err = TestReadAttributeBitmap16NotDefaultValue_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Write attribute BITMAP16 Default Value\n");
            err = TestWriteAttributeBitmap16DefaultValue_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Read attribute BITMAP16 Default Value\n");
            err = TestReadAttributeBitmap16DefaultValue_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Read attribute BITMAP32 Default Value\n");
            err = TestReadAttributeBitmap32DefaultValue_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Write attribute BITMAP32 Not Default Value\n");
            err = TestWriteAttributeBitmap32NotDefaultValue_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Read attribute BITMAP32 Not Default Value\n");
            err = TestReadAttributeBitmap32NotDefaultValue_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : Write attribute BITMAP32 Default Value\n");
            err = TestWriteAttributeBitmap32DefaultValue_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : Read attribute BITMAP32 Default Value\n");
            err = TestReadAttributeBitmap32DefaultValue_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : Read attribute BITMAP64 Default Value\n");
            err = TestReadAttributeBitmap64DefaultValue_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : Write attribute BITMAP64 Not Default Value\n");
            err = TestWriteAttributeBitmap64NotDefaultValue_25();
            break;
        case 26:
            ChipLogProgress(chipTool, " ***** Test Step 26 : Read attribute BITMAP64 Default Value\n");
            err = TestReadAttributeBitmap64DefaultValue_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : Write attribute BITMAP64 Default Value\n");
            err = TestWriteAttributeBitmap64DefaultValue_27();
            break;
        case 28:
            ChipLogProgress(chipTool, " ***** Test Step 28 : Read attribute BITMAP64 Default Value\n");
            err = TestReadAttributeBitmap64DefaultValue_28();
            break;
        case 29:
            ChipLogProgress(chipTool, " ***** Test Step 29 : Read attribute INT8U Default Value\n");
            err = TestReadAttributeInt8uDefaultValue_29();
            break;
        case 30:
            ChipLogProgress(chipTool, " ***** Test Step 30 : Write attribute INT8U Not Default Value\n");
            err = TestWriteAttributeInt8uNotDefaultValue_30();
            break;
        case 31:
            ChipLogProgress(chipTool, " ***** Test Step 31 : Read attribute INT8U Not Default Value\n");
            err = TestReadAttributeInt8uNotDefaultValue_31();
            break;
        case 32:
            ChipLogProgress(chipTool, " ***** Test Step 32 : Write attribute INT8U Default Value\n");
            err = TestWriteAttributeInt8uDefaultValue_32();
            break;
        case 33:
            ChipLogProgress(chipTool, " ***** Test Step 33 : Read attribute INT8U Default Value\n");
            err = TestReadAttributeInt8uDefaultValue_33();
            break;
        case 34:
            ChipLogProgress(chipTool, " ***** Test Step 34 : Read attribute INT16U Default Value\n");
            err = TestReadAttributeInt16uDefaultValue_34();
            break;
        case 35:
            ChipLogProgress(chipTool, " ***** Test Step 35 : Write attribute INT16U Not Default Value\n");
            err = TestWriteAttributeInt16uNotDefaultValue_35();
            break;
        case 36:
            ChipLogProgress(chipTool, " ***** Test Step 36 : Read attribute INT16U Not Default Value\n");
            err = TestReadAttributeInt16uNotDefaultValue_36();
            break;
        case 37:
            ChipLogProgress(chipTool, " ***** Test Step 37 : Write attribute INT16U Default Value\n");
            err = TestWriteAttributeInt16uDefaultValue_37();
            break;
        case 38:
            ChipLogProgress(chipTool, " ***** Test Step 38 : Read attribute INT16U Default Value\n");
            err = TestReadAttributeInt16uDefaultValue_38();
            break;
        case 39:
            ChipLogProgress(chipTool, " ***** Test Step 39 : Read attribute INT32U Default Value\n");
            err = TestReadAttributeInt32uDefaultValue_39();
            break;
        case 40:
            ChipLogProgress(chipTool, " ***** Test Step 40 : Write attribute INT32U Not Default Value\n");
            err = TestWriteAttributeInt32uNotDefaultValue_40();
            break;
        case 41:
            ChipLogProgress(chipTool, " ***** Test Step 41 : Read attribute INT32U Not Default Value\n");
            err = TestReadAttributeInt32uNotDefaultValue_41();
            break;
        case 42:
            ChipLogProgress(chipTool, " ***** Test Step 42 : Write attribute INT32U Default Value\n");
            err = TestWriteAttributeInt32uDefaultValue_42();
            break;
        case 43:
            ChipLogProgress(chipTool, " ***** Test Step 43 : Read attribute INT32U Default Value\n");
            err = TestReadAttributeInt32uDefaultValue_43();
            break;
        case 44:
            ChipLogProgress(chipTool, " ***** Test Step 44 : Read attribute INT64U Default Value\n");
            err = TestReadAttributeInt64uDefaultValue_44();
            break;
        case 45:
            ChipLogProgress(chipTool, " ***** Test Step 45 : Write attribute INT64U Not Default Value\n");
            err = TestWriteAttributeInt64uNotDefaultValue_45();
            break;
        case 46:
            ChipLogProgress(chipTool, " ***** Test Step 46 : Read attribute INT64U Not Default Value\n");
            err = TestReadAttributeInt64uNotDefaultValue_46();
            break;
        case 47:
            ChipLogProgress(chipTool, " ***** Test Step 47 : Write attribute INT64U Default Value\n");
            err = TestWriteAttributeInt64uDefaultValue_47();
            break;
        case 48:
            ChipLogProgress(chipTool, " ***** Test Step 48 : Read attribute INT64U Default Value\n");
            err = TestReadAttributeInt64uDefaultValue_48();
            break;
        case 49:
            ChipLogProgress(chipTool, " ***** Test Step 49 : Read attribute INT8S Default Value\n");
            err = TestReadAttributeInt8sDefaultValue_49();
            break;
        case 50:
            ChipLogProgress(chipTool, " ***** Test Step 50 : Write attribute INT8S Not Default Value\n");
            err = TestWriteAttributeInt8sNotDefaultValue_50();
            break;
        case 51:
            ChipLogProgress(chipTool, " ***** Test Step 51 : Read attribute INT8S Not Default Value\n");
            err = TestReadAttributeInt8sNotDefaultValue_51();
            break;
        case 52:
            ChipLogProgress(chipTool, " ***** Test Step 52 : Write attribute INT8S Default Value\n");
            err = TestWriteAttributeInt8sDefaultValue_52();
            break;
        case 53:
            ChipLogProgress(chipTool, " ***** Test Step 53 : Read attribute INT8S Default Value\n");
            err = TestReadAttributeInt8sDefaultValue_53();
            break;
        case 54:
            ChipLogProgress(chipTool, " ***** Test Step 54 : Read attribute INT16S Default Value\n");
            err = TestReadAttributeInt16sDefaultValue_54();
            break;
        case 55:
            ChipLogProgress(chipTool, " ***** Test Step 55 : Write attribute INT16S Not Default Value\n");
            err = TestWriteAttributeInt16sNotDefaultValue_55();
            break;
        case 56:
            ChipLogProgress(chipTool, " ***** Test Step 56 : Read attribute INT16S Not Default Value\n");
            err = TestReadAttributeInt16sNotDefaultValue_56();
            break;
        case 57:
            ChipLogProgress(chipTool, " ***** Test Step 57 : Write attribute INT16S Default Value\n");
            err = TestWriteAttributeInt16sDefaultValue_57();
            break;
        case 58:
            ChipLogProgress(chipTool, " ***** Test Step 58 : Read attribute INT16S Default Value\n");
            err = TestReadAttributeInt16sDefaultValue_58();
            break;
        case 59:
            ChipLogProgress(chipTool, " ***** Test Step 59 : Read attribute INT32S Default Value\n");
            err = TestReadAttributeInt32sDefaultValue_59();
            break;
        case 60:
            ChipLogProgress(chipTool, " ***** Test Step 60 : Write attribute INT32S Not Default Value\n");
            err = TestWriteAttributeInt32sNotDefaultValue_60();
            break;
        case 61:
            ChipLogProgress(chipTool, " ***** Test Step 61 : Read attribute INT32S Not Default Value\n");
            err = TestReadAttributeInt32sNotDefaultValue_61();
            break;
        case 62:
            ChipLogProgress(chipTool, " ***** Test Step 62 : Write attribute INT32S Default Value\n");
            err = TestWriteAttributeInt32sDefaultValue_62();
            break;
        case 63:
            ChipLogProgress(chipTool, " ***** Test Step 63 : Read attribute INT32S Default Value\n");
            err = TestReadAttributeInt32sDefaultValue_63();
            break;
        case 64:
            ChipLogProgress(chipTool, " ***** Test Step 64 : Read attribute INT64S Default Value\n");
            err = TestReadAttributeInt64sDefaultValue_64();
            break;
        case 65:
            ChipLogProgress(chipTool, " ***** Test Step 65 : Write attribute INTS Not Default Value\n");
            err = TestWriteAttributeIntsNotDefaultValue_65();
            break;
        case 66:
            ChipLogProgress(chipTool, " ***** Test Step 66 : Read attribute INT64S Not Default Value\n");
            err = TestReadAttributeInt64sNotDefaultValue_66();
            break;
        case 67:
            ChipLogProgress(chipTool, " ***** Test Step 67 : Write attribute INT64S Default Value\n");
            err = TestWriteAttributeInt64sDefaultValue_67();
            break;
        case 68:
            ChipLogProgress(chipTool, " ***** Test Step 68 : Read attribute INT64S Default Value\n");
            err = TestReadAttributeInt64sDefaultValue_68();
            break;
        case 69:
            ChipLogProgress(chipTool, " ***** Test Step 69 : Read attribute ENUM8 Default Value\n");
            err = TestReadAttributeEnum8DefaultValue_69();
            break;
        case 70:
            ChipLogProgress(chipTool, " ***** Test Step 70 : Write attribute ENUM8 Not Default Value\n");
            err = TestWriteAttributeEnum8NotDefaultValue_70();
            break;
        case 71:
            ChipLogProgress(chipTool, " ***** Test Step 71 : Read attribute ENUM8 Not Default Value\n");
            err = TestReadAttributeEnum8NotDefaultValue_71();
            break;
        case 72:
            ChipLogProgress(chipTool, " ***** Test Step 72 : Write attribute ENUM8 Default Value\n");
            err = TestWriteAttributeEnum8DefaultValue_72();
            break;
        case 73:
            ChipLogProgress(chipTool, " ***** Test Step 73 : Read attribute ENUM8 Default Value\n");
            err = TestReadAttributeEnum8DefaultValue_73();
            break;
        case 74:
            ChipLogProgress(chipTool, " ***** Test Step 74 : Read attribute ENUM16 Default Value\n");
            err = TestReadAttributeEnum16DefaultValue_74();
            break;
        case 75:
            ChipLogProgress(chipTool, " ***** Test Step 75 : Write attribute ENUM16 Not Default Value\n");
            err = TestWriteAttributeEnum16NotDefaultValue_75();
            break;
        case 76:
            ChipLogProgress(chipTool, " ***** Test Step 76 : Read attribute ENUM16 Not Default Value\n");
            err = TestReadAttributeEnum16NotDefaultValue_76();
            break;
        case 77:
            ChipLogProgress(chipTool, " ***** Test Step 77 : Write attribute ENUM16 Default Value\n");
            err = TestWriteAttributeEnum16DefaultValue_77();
            break;
        case 78:
            ChipLogProgress(chipTool, " ***** Test Step 78 : Read attribute ENUM16 Default Value\n");
            err = TestReadAttributeEnum16DefaultValue_78();
            break;
        case 79:
            ChipLogProgress(chipTool, " ***** Test Step 79 : Read attribute EPOCH_US Default Value\n");
            err = TestReadAttributeEpochUsDefaultValue_79();
            break;
        case 80:
            ChipLogProgress(chipTool, " ***** Test Step 80 : Write attribute EPOCH_US Not Default Value\n");
            err = TestWriteAttributeEpochUsNotDefaultValue_80();
            break;
        case 81:
            ChipLogProgress(chipTool, " ***** Test Step 81 : Read attribute EPOCH_US Not Default Value\n");
            err = TestReadAttributeEpochUsNotDefaultValue_81();
            break;
        case 82:
            ChipLogProgress(chipTool, " ***** Test Step 82 : Write attribute EPOCH_US Default Value\n");
            err = TestWriteAttributeEpochUsDefaultValue_82();
            break;
        case 83:
            ChipLogProgress(chipTool, " ***** Test Step 83 : Read attribute EPOCH_US Default Value\n");
            err = TestReadAttributeEpochUsDefaultValue_83();
            break;
        case 84:
            ChipLogProgress(chipTool, " ***** Test Step 84 : Read attribute EPOCH_S Default Value\n");
            err = TestReadAttributeEpochSDefaultValue_84();
            break;
        case 85:
            ChipLogProgress(chipTool, " ***** Test Step 85 : Write attribute EPOCH_S Not Default Value\n");
            err = TestWriteAttributeEpochSNotDefaultValue_85();
            break;
        case 86:
            ChipLogProgress(chipTool, " ***** Test Step 86 : Read attribute EPOCH_S Not Default Value\n");
            err = TestReadAttributeEpochSNotDefaultValue_86();
            break;
        case 87:
            ChipLogProgress(chipTool, " ***** Test Step 87 : Write attribute EPOCH_S Default Value\n");
            err = TestWriteAttributeEpochSDefaultValue_87();
            break;
        case 88:
            ChipLogProgress(chipTool, " ***** Test Step 88 : Read attribute EPOCH_S Default Value\n");
            err = TestReadAttributeEpochSDefaultValue_88();
            break;
        case 89:
            ChipLogProgress(chipTool, " ***** Test Step 89 : Read attribute vendor_id Default Value\n");
            err = TestReadAttributeVendorIdDefaultValue_89();
            break;
        case 90:
            ChipLogProgress(chipTool, " ***** Test Step 90 : Write attribute vendor_id Not Default Value\n");
            err = TestWriteAttributeVendorIdNotDefaultValue_90();
            break;
        case 91:
            ChipLogProgress(chipTool, " ***** Test Step 91 : Read attribute vendor_id Not Default Value\n");
            err = TestReadAttributeVendorIdNotDefaultValue_91();
            break;
        case 92:
            ChipLogProgress(chipTool, " ***** Test Step 92 : Write attribute vendor_id Default Value\n");
            err = TestWriteAttributeVendorIdDefaultValue_92();
            break;
        case 93:
            ChipLogProgress(chipTool, " ***** Test Step 93 : Read attribute vendor_id Default Value\n");
            err = TestReadAttributeVendorIdDefaultValue_93();
            break;
        case 94:
            ChipLogProgress(chipTool, " ***** Test Step 94 : Read attribute char_string Default Value\n");
            err = TestReadAttributeCharStringDefaultValue_94();
            break;
        case 95:
            ChipLogProgress(
                chipTool, " ***** Test Step 95 : Read attribute char_string Default Value and compare to saved value\n");
            err = TestReadAttributeCharStringDefaultValueAndCompareToSavedValue_95();
            break;
        case 96:
            ChipLogProgress(chipTool, " ***** Test Step 96 : Write attribute char_string Not Default Value\n");
            err = TestWriteAttributeCharStringNotDefaultValue_96();
            break;
        case 97:
            ChipLogProgress(chipTool, " ***** Test Step 97 : Read attribute char_string Not Default Value\n");
            err = TestReadAttributeCharStringNotDefaultValue_97();
            break;
        case 98:
            ChipLogProgress(
                chipTool, " ***** Test Step 98 : Read attribute char_string Not Default Value and compare to saved value\n");
            err = TestReadAttributeCharStringNotDefaultValueAndCompareToSavedValue_98();
            break;
        case 99:
            ChipLogProgress(chipTool, " ***** Test Step 99 : Write attribute char_string Not Default Value from saved value\n");
            err = TestWriteAttributeCharStringNotDefaultValueFromSavedValue_99();
            break;
        case 100:
            ChipLogProgress(
                chipTool, " ***** Test Step 100 : Read attribute char_string Not Default Value and compare to expected value\n");
            err = TestReadAttributeCharStringNotDefaultValueAndCompareToExpectedValue_100();
            break;
        case 101:
            ChipLogProgress(chipTool, " ***** Test Step 101 : Write attribute char_string Default Value\n");
            err = TestWriteAttributeCharStringDefaultValue_101();
            break;
        case 102:
            ChipLogProgress(chipTool, " ***** Test Step 102 : Read attribute octet_string Default Value\n");
            err = TestReadAttributeOctetStringDefaultValue_102();
            break;
        case 103:
            ChipLogProgress(
                chipTool, " ***** Test Step 103 : Read attribute octet_string Default Value and compare to saved value\n");
            err = TestReadAttributeOctetStringDefaultValueAndCompareToSavedValue_103();
            break;
        case 104:
            ChipLogProgress(chipTool, " ***** Test Step 104 : Write attribute octet_string Not Default Value\n");
            err = TestWriteAttributeOctetStringNotDefaultValue_104();
            break;
        case 105:
            ChipLogProgress(chipTool, " ***** Test Step 105 : Read attribute octet_string Not Default Value\n");
            err = TestReadAttributeOctetStringNotDefaultValue_105();
            break;
        case 106:
            ChipLogProgress(
                chipTool, " ***** Test Step 106 : Read attribute octet_string Not Default Value and compare to saved value\n");
            err = TestReadAttributeOctetStringNotDefaultValueAndCompareToSavedValue_106();
            break;
        case 107:
            ChipLogProgress(chipTool, " ***** Test Step 107 : Write attribute octet_string Not Default Value from saved value\n");
            err = TestWriteAttributeOctetStringNotDefaultValueFromSavedValue_107();
            break;
        case 108:
            ChipLogProgress(
                chipTool, " ***** Test Step 108 : Read attribute octet_string Not Default Value and compare to expected value\n");
            err = TestReadAttributeOctetStringNotDefaultValueAndCompareToExpectedValue_108();
            break;
        case 109:
            ChipLogProgress(chipTool, " ***** Test Step 109 : Write attribute octet_string Default Value\n");
            err = TestWriteAttributeOctetStringDefaultValue_109();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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));
            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));
            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));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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));
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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));
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 46:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 50:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 51:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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));
            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));
            break;
        case 58:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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));
            break;
        case 61:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 70:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 71:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 72:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 73:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 77:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 78:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 79:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 80:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 81:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 82:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 83:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 87:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 88:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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));
            break;
        case 91:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 92:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 93:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 94:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 95:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 96:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 101:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 102:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 103:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 104:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 105:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 106:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 107:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 108:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 109:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 110;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }
    NSNumber * _Nonnull TestAddArgumentDefaultValue;

    CHIP_ERROR TestSendTestAddArgumentsCommand_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestAddArgumentsParams alloc] init];
        params.arg1 = [NSNumber numberWithUnsignedChar:3U];
        params.arg2 = [NSNumber numberWithUnsignedChar:17U];
        [cluster testAddArgumentsWithParams:params
                                 completion:^(MTRUnitTestingClusterTestAddArgumentsResponseParams * _Nullable values,
                                     NSError * _Nullable err) {
                                     NSLog(@"Send Test Add Arguments Command Error: %@", err);

                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                     {
                                         id actualValue = values.returnValue;
                                         VerifyOrReturn(CheckValue("returnValue", actualValue, 20U));
                                     }
                                     {
                                         TestAddArgumentDefaultValue = values.returnValue;
                                     }

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestAddArgumentsCommand_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestAddArgumentsParams alloc] init];
        params.arg1 = [NSNumber numberWithUnsignedChar:3U];
        params.arg2 = [NSNumber numberWithUnsignedChar:17U];
        [cluster testAddArgumentsWithParams:params
                                 completion:^(MTRUnitTestingClusterTestAddArgumentsResponseParams * _Nullable values,
                                     NSError * _Nullable err) {
                                     NSLog(@"Send Test Add Arguments Command Error: %@", err);

                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                     {
                                         id actualValue = values.returnValue;
                                         VerifyOrReturn(CheckValue("returnValue", actualValue, TestAddArgumentDefaultValue));
                                     }

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestAddArgumentsCommand_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestAddArgumentsParams alloc] init];
        params.arg1 = [NSNumber numberWithUnsignedChar:3U];
        params.arg2 = [TestAddArgumentDefaultValue copy];
        [cluster testAddArgumentsWithParams:params
                                 completion:^(MTRUnitTestingClusterTestAddArgumentsResponseParams * _Nullable values,
                                     NSError * _Nullable err) {
                                     NSLog(@"Send Test Add Arguments Command Error: %@", err);

                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                     VerifyOrReturn(
                                         CheckConstraintNotValue("returnValue", values.returnValue, TestAddArgumentDefaultValue));

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull readAttributeBooleanDefaultValue;

    CHIP_ERROR TestReadAttributeBooleanDefaultValue_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBooleanWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BOOLEAN Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("boolean", actualValue, 0));
            }
            {
                readAttributeBooleanDefaultValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeBooleanNotDefaultValue_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id booleanArgument;
        booleanArgument = [NSNumber numberWithBool:1];
        [cluster writeAttributeBooleanWithValue:booleanArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Write attribute BOOLEAN Not Default Value Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBooleanNotDefaultValue_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBooleanWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BOOLEAN Not Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintNotValue("boolean", value, readAttributeBooleanDefaultValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeBooleanDefaultValue_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id booleanArgument;
        booleanArgument = [readAttributeBooleanDefaultValue copy];
        [cluster writeAttributeBooleanWithValue:booleanArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Write attribute BOOLEAN DefaultValue Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBooleanFalse_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBooleanWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BOOLEAN False Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("boolean", actualValue, readAttributeBooleanDefaultValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull readAttributeBitmap8DefaultValue;

    CHIP_ERROR TestReadAttributeBitmap8DefaultValue_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP8 Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap8", actualValue, 0U));
            }
            {
                readAttributeBitmap8DefaultValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeBitmap8NotDefaultValue_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap8Argument;
        bitmap8Argument = [NSNumber numberWithUnsignedChar:1U];
        [cluster writeAttributeBitmap8WithValue:bitmap8Argument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Write attribute BITMAP8 Not Default Value Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap8NotDefaultValue_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP8 Not Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintNotValue("bitmap8", value, readAttributeBitmap8DefaultValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeBitmap8DefaultValue_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap8Argument;
        bitmap8Argument = [readAttributeBitmap8DefaultValue copy];
        [cluster writeAttributeBitmap8WithValue:bitmap8Argument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Write attribute BITMAP8 Default Value Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap8DefaultValue_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP8 Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap8", actualValue, readAttributeBitmap8DefaultValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull readAttributeBitmap16DefaultValue;

    CHIP_ERROR TestReadAttributeBitmap16DefaultValue_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP16 Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap16", actualValue, 0U));
            }
            {
                readAttributeBitmap16DefaultValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeBitmap16NotDefaultValue_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap16Argument;
        bitmap16Argument = [NSNumber numberWithUnsignedShort:1U];
        [cluster writeAttributeBitmap16WithValue:bitmap16Argument
                                      completion:^(NSError * _Nullable err) {
                                          NSLog(@"Write attribute BITMAP16 Not Default Value Error: %@", err);

                                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                          NextTest();
                                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap16NotDefaultValue_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP16 Not Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintNotValue("bitmap16", value, readAttributeBitmap16DefaultValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeBitmap16DefaultValue_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap16Argument;
        bitmap16Argument = [readAttributeBitmap16DefaultValue copy];
        [cluster writeAttributeBitmap16WithValue:bitmap16Argument
                                      completion:^(NSError * _Nullable err) {
                                          NSLog(@"Write attribute BITMAP16 Default Value Error: %@", err);

                                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                          NextTest();
                                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap16DefaultValue_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP16 Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap16", actualValue, readAttributeBitmap16DefaultValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull readAttributeBitmap32DefaultValue;

    CHIP_ERROR TestReadAttributeBitmap32DefaultValue_19()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap32WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP32 Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap32", actualValue, 0UL));
            }
            {
                readAttributeBitmap32DefaultValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeBitmap32NotDefaultValue_20()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap32Argument;
        bitmap32Argument = [NSNumber numberWithUnsignedInt:1UL];
        [cluster writeAttributeBitmap32WithValue:bitmap32Argument
                                      completion:^(NSError * _Nullable err) {
                                          NSLog(@"Write attribute BITMAP32 Not Default Value Error: %@", err);

                                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                          NextTest();
                                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap32NotDefaultValue_21()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap32WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP32 Not Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintNotValue("bitmap32", value, readAttributeBitmap32DefaultValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeBitmap32DefaultValue_22()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap32Argument;
        bitmap32Argument = [readAttributeBitmap32DefaultValue copy];
        [cluster writeAttributeBitmap32WithValue:bitmap32Argument
                                      completion:^(NSError * _Nullable err) {
                                          NSLog(@"Write attribute BITMAP32 Default Value Error: %@", err);

                                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                          NextTest();
                                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap32DefaultValue_23()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap32WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP32 Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap32", actualValue, readAttributeBitmap32DefaultValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull readAttributeBitmap64DefaultValue;

    CHIP_ERROR TestReadAttributeBitmap64DefaultValue_24()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap64WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP64 Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap64", actualValue, 0ULL));
            }
            {
                readAttributeBitmap64DefaultValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeBitmap64NotDefaultValue_25()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap64Argument;
        bitmap64Argument = [NSNumber numberWithUnsignedLongLong:1ULL];
        [cluster writeAttributeBitmap64WithValue:bitmap64Argument
                                      completion:^(NSError * _Nullable err) {
                                          NSLog(@"Write attribute BITMAP64 Not Default Value Error: %@", err);

                                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                          NextTest();
                                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap64DefaultValue_26()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap64WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP64 Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintNotValue("bitmap64", value, readAttributeBitmap64DefaultValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeBitmap64DefaultValue_27()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap64Argument;
        bitmap64Argument = [readAttributeBitmap64DefaultValue copy];
        [cluster writeAttributeBitmap64WithValue:bitmap64Argument
                                      completion:^(NSError * _Nullable err) {
                                          NSLog(@"Write attribute BITMAP64 Default Value Error: %@", err);

                                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                          NextTest();
                                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeBitmap64DefaultValue_28()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap64WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute BITMAP64 Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("bitmap64", actualValue, readAttributeBitmap64DefaultValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull readAttributeInt8uDefaultValue;

    CHIP_ERROR TestReadAttributeInt8uDefaultValue_29()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT8U Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int8u", actualValue, 0U));
            }
            {
                readAttributeInt8uDefaultValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt8uNotDefaultValue_30()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int8uArgument;
        int8uArgument = [NSNumber numberWithUnsignedChar:1U];
        [cluster writeAttributeInt8uWithValue:int8uArgument
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Write attribute INT8U Not Default Value Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt8uNotDefaultValue_31()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT8U Not Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintNotValue("int8u", value, readAttributeInt8uDefaultValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt8uDefaultValue_32()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int8uArgument;
        int8uArgument = [readAttributeInt8uDefaultValue copy];
        [cluster writeAttributeInt8uWithValue:int8uArgument
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Write attribute INT8U Default Value Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt8uDefaultValue_33()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT8U Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int8u", actualValue, readAttributeInt8uDefaultValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull readAttributeInt16uDefaultValue;

    CHIP_ERROR TestReadAttributeInt16uDefaultValue_34()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT16U Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int16u", actualValue, 0U));
            }
            {
                readAttributeInt16uDefaultValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt16uNotDefaultValue_35()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int16uArgument;
        int16uArgument = [NSNumber numberWithUnsignedShort:1U];
        [cluster writeAttributeInt16uWithValue:int16uArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT16U Not Default Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt16uNotDefaultValue_36()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT16U Not Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintNotValue("int16u", value, readAttributeInt16uDefaultValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt16uDefaultValue_37()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int16uArgument;
        int16uArgument = [readAttributeInt16uDefaultValue copy];
        [cluster writeAttributeInt16uWithValue:int16uArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT16U Default Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt16uDefaultValue_38()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT16U Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int16u", actualValue, readAttributeInt16uDefaultValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull readAttributeInt32uDefaultValue;

    CHIP_ERROR TestReadAttributeInt32uDefaultValue_39()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT32U Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int32u", actualValue, 0UL));
            }
            {
                readAttributeInt32uDefaultValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt32uNotDefaultValue_40()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int32uArgument;
        int32uArgument = [NSNumber numberWithUnsignedInt:1UL];
        [cluster writeAttributeInt32uWithValue:int32uArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT32U Not Default Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt32uNotDefaultValue_41()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT32U Not Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintNotValue("int32u", value, readAttributeInt32uDefaultValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt32uDefaultValue_42()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int32uArgument;
        int32uArgument = [readAttributeInt32uDefaultValue copy];
        [cluster writeAttributeInt32uWithValue:int32uArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT32U Default Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt32uDefaultValue_43()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT32U Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int32u", actualValue, readAttributeInt32uDefaultValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull readAttributeInt64uDefaultValue;

    CHIP_ERROR TestReadAttributeInt64uDefaultValue_44()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt64uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT64U Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int64u", actualValue, 0ULL));
            }
            {
                readAttributeInt64uDefaultValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt64uNotDefaultValue_45()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int64uArgument;
        int64uArgument = [NSNumber numberWithUnsignedLongLong:1ULL];
        [cluster writeAttributeInt64uWithValue:int64uArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT64U Not Default Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt64uNotDefaultValue_46()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt64uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT64U Not Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintNotValue("int64u", value, readAttributeInt64uDefaultValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt64uDefaultValue_47()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int64uArgument;
        int64uArgument = [readAttributeInt64uDefaultValue copy];
        [cluster writeAttributeInt64uWithValue:int64uArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT64U Default Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt64uDefaultValue_48()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt64uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT64U Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int64u", actualValue, readAttributeInt64uDefaultValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull readAttributeInt8sDefaultValue;

    CHIP_ERROR TestReadAttributeInt8sDefaultValue_49()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT8S Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int8s", actualValue, 0));
            }
            {
                readAttributeInt8sDefaultValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt8sNotDefaultValue_50()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int8sArgument;
        int8sArgument = [NSNumber numberWithChar:1];
        [cluster writeAttributeInt8sWithValue:int8sArgument
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Write attribute INT8S Not Default Value Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt8sNotDefaultValue_51()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT8S Not Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintNotValue("int8s", value, readAttributeInt8sDefaultValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt8sDefaultValue_52()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int8sArgument;
        int8sArgument = [readAttributeInt8sDefaultValue copy];
        [cluster writeAttributeInt8sWithValue:int8sArgument
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Write attribute INT8S Default Value Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt8sDefaultValue_53()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT8S Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int8s", actualValue, readAttributeInt8sDefaultValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull readAttributeInt16sDefaultValue;

    CHIP_ERROR TestReadAttributeInt16sDefaultValue_54()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT16S Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int16s", actualValue, 0));
            }
            {
                readAttributeInt16sDefaultValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt16sNotDefaultValue_55()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int16sArgument;
        int16sArgument = [NSNumber numberWithShort:1];
        [cluster writeAttributeInt16sWithValue:int16sArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT16S Not Default Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt16sNotDefaultValue_56()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT16S Not Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintNotValue("int16s", value, readAttributeInt16sDefaultValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt16sDefaultValue_57()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int16sArgument;
        int16sArgument = [readAttributeInt16sDefaultValue copy];
        [cluster writeAttributeInt16sWithValue:int16sArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT16S Default Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt16sDefaultValue_58()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT16S Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int16s", actualValue, readAttributeInt16sDefaultValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull readAttributeInt32sDefaultValue;

    CHIP_ERROR TestReadAttributeInt32sDefaultValue_59()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT32S Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int32s", actualValue, 0L));
            }
            {
                readAttributeInt32sDefaultValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt32sNotDefaultValue_60()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int32sArgument;
        int32sArgument = [NSNumber numberWithInt:1L];
        [cluster writeAttributeInt32sWithValue:int32sArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT32S Not Default Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt32sNotDefaultValue_61()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT32S Not Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintNotValue("int32s", value, readAttributeInt32sDefaultValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt32sDefaultValue_62()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int32sArgument;
        int32sArgument = [readAttributeInt32sDefaultValue copy];
        [cluster writeAttributeInt32sWithValue:int32sArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT32S Default Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt32sDefaultValue_63()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT32S Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int32s", actualValue, readAttributeInt32sDefaultValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull readAttributeInt64sDefaultValue;

    CHIP_ERROR TestReadAttributeInt64sDefaultValue_64()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt64sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT64S Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int64s", actualValue, 0LL));
            }
            {
                readAttributeInt64sDefaultValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeIntsNotDefaultValue_65()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int64sArgument;
        int64sArgument = [NSNumber numberWithLongLong:1LL];
        [cluster writeAttributeInt64sWithValue:int64sArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INTS Not Default Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt64sNotDefaultValue_66()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt64sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT64S Not Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintNotValue("int64s", value, readAttributeInt64sDefaultValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeInt64sDefaultValue_67()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int64sArgument;
        int64sArgument = [readAttributeInt64sDefaultValue copy];
        [cluster writeAttributeInt64sWithValue:int64sArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute INT64S Default Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeInt64sDefaultValue_68()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt64sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute INT64S Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("int64s", actualValue, readAttributeInt64sDefaultValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull readAttributeEnum8DefaultValue;

    CHIP_ERROR TestReadAttributeEnum8DefaultValue_69()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnum8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute ENUM8 Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("enum8", actualValue, 0U));
            }
            {
                readAttributeEnum8DefaultValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeEnum8NotDefaultValue_70()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id enum8Argument;
        enum8Argument = [NSNumber numberWithUnsignedChar:1U];
        [cluster writeAttributeEnum8WithValue:enum8Argument
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Write attribute ENUM8 Not Default Value Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeEnum8NotDefaultValue_71()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnum8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute ENUM8 Not Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintNotValue("enum8", value, readAttributeEnum8DefaultValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeEnum8DefaultValue_72()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id enum8Argument;
        enum8Argument = [readAttributeEnum8DefaultValue copy];
        [cluster writeAttributeEnum8WithValue:enum8Argument
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Write attribute ENUM8 Default Value Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeEnum8DefaultValue_73()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnum8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute ENUM8 Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("enum8", actualValue, readAttributeEnum8DefaultValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull readAttributeEnum16DefaultValue;

    CHIP_ERROR TestReadAttributeEnum16DefaultValue_74()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnum16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute ENUM16 Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("enum16", actualValue, 0U));
            }
            {
                readAttributeEnum16DefaultValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeEnum16NotDefaultValue_75()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id enum16Argument;
        enum16Argument = [NSNumber numberWithUnsignedShort:1U];
        [cluster writeAttributeEnum16WithValue:enum16Argument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute ENUM16 Not Default Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeEnum16NotDefaultValue_76()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnum16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute ENUM16 Not Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintNotValue("enum16", value, readAttributeEnum16DefaultValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeEnum16DefaultValue_77()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id enum16Argument;
        enum16Argument = [readAttributeEnum16DefaultValue copy];
        [cluster writeAttributeEnum16WithValue:enum16Argument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute ENUM16 Default Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeEnum16DefaultValue_78()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnum16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute ENUM16 Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("enum16", actualValue, readAttributeEnum16DefaultValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull readAttributeEpochUSDefaultValue;

    CHIP_ERROR TestReadAttributeEpochUsDefaultValue_79()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEpochUsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute EPOCH_US Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("epoch_us", actualValue, 0ULL));
            }
            {
                readAttributeEpochUSDefaultValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeEpochUsNotDefaultValue_80()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id epochUsArgument;
        epochUsArgument = [NSNumber numberWithUnsignedLongLong:1ULL];
        [cluster writeAttributeEpochUsWithValue:epochUsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Write attribute EPOCH_US Not Default Value Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeEpochUsNotDefaultValue_81()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEpochUsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute EPOCH_US Not Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintNotValue("epochUs", value, readAttributeEpochUSDefaultValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeEpochUsDefaultValue_82()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id epochUsArgument;
        epochUsArgument = [readAttributeEpochUSDefaultValue copy];
        [cluster writeAttributeEpochUsWithValue:epochUsArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Write attribute EPOCH_US Default Value Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeEpochUsDefaultValue_83()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEpochUsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute EPOCH_US Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("epoch_us", actualValue, readAttributeEpochUSDefaultValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull readAttributeEpochSDefaultValue;

    CHIP_ERROR TestReadAttributeEpochSDefaultValue_84()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEpochSWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute EPOCH_S Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("epoch_s", actualValue, 0UL));
            }
            {
                readAttributeEpochSDefaultValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeEpochSNotDefaultValue_85()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id epochSArgument;
        epochSArgument = [NSNumber numberWithUnsignedInt:1UL];
        [cluster writeAttributeEpochSWithValue:epochSArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute EPOCH_S Not Default Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeEpochSNotDefaultValue_86()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEpochSWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute EPOCH_S Not Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintNotValue("epochS", value, readAttributeEpochSDefaultValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeEpochSDefaultValue_87()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id epochSArgument;
        epochSArgument = [readAttributeEpochSDefaultValue copy];
        [cluster writeAttributeEpochSWithValue:epochSArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute EPOCH_S Default Value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeEpochSDefaultValue_88()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEpochSWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute EPOCH_S Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("epoch_s", actualValue, readAttributeEpochSDefaultValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull readAttributeVendorIdDefaultValue;

    CHIP_ERROR TestReadAttributeVendorIdDefaultValue_89()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeVendorIdWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute vendor_id Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("vendor_id", actualValue, 0U));
            }
            {
                readAttributeVendorIdDefaultValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeVendorIdNotDefaultValue_90()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id vendorIdArgument;
        vendorIdArgument = [NSNumber numberWithUnsignedShort:1U];
        [cluster writeAttributeVendorIdWithValue:vendorIdArgument
                                      completion:^(NSError * _Nullable err) {
                                          NSLog(@"Write attribute vendor_id Not Default Value Error: %@", err);

                                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                          NextTest();
                                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeVendorIdNotDefaultValue_91()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeVendorIdWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute vendor_id Not Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintNotValue("vendorId", value, readAttributeVendorIdDefaultValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeVendorIdDefaultValue_92()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id vendorIdArgument;
        vendorIdArgument = [readAttributeVendorIdDefaultValue copy];
        [cluster writeAttributeVendorIdWithValue:vendorIdArgument
                                      completion:^(NSError * _Nullable err) {
                                          NSLog(@"Write attribute vendor_id Default Value Error: %@", err);

                                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                          NextTest();
                                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeVendorIdDefaultValue_93()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeVendorIdWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute vendor_id Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("vendor_id", actualValue, readAttributeVendorIdDefaultValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSString * _Nonnull readAttributeCharStringDefaultValue;

    CHIP_ERROR TestReadAttributeCharStringDefaultValue_94()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute char_string Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("char_string", actualValue, @""));
            }
            {
                readAttributeCharStringDefaultValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeCharStringDefaultValueAndCompareToSavedValue_95()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute char_string Default Value and compare to saved value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("char_string", actualValue, readAttributeCharStringDefaultValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeCharStringNotDefaultValue_96()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id charStringArgument;
        charStringArgument = @"NotDefault";
        [cluster writeAttributeCharStringWithValue:charStringArgument
                                        completion:^(NSError * _Nullable err) {
                                            NSLog(@"Write attribute char_string Not Default Value Error: %@", err);

                                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                            NextTest();
                                        }];

        return CHIP_NO_ERROR;
    }
    NSString * _Nonnull readAttributeCharStringNotDefaultValue;

    CHIP_ERROR TestReadAttributeCharStringNotDefaultValue_97()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute char_string Not Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("char_string", actualValue, @"NotDefault"));
            }

            VerifyOrReturn(CheckConstraintNotValue("charString", value, readAttributeCharStringDefaultValue));
            {
                readAttributeCharStringNotDefaultValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeCharStringNotDefaultValueAndCompareToSavedValue_98()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute char_string Not Default Value and compare to saved value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("char_string", actualValue, readAttributeCharStringNotDefaultValue));
            }

            VerifyOrReturn(CheckConstraintNotValue("charString", value, readAttributeCharStringDefaultValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeCharStringNotDefaultValueFromSavedValue_99()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id charStringArgument;
        charStringArgument = [readAttributeCharStringNotDefaultValue copy];
        [cluster writeAttributeCharStringWithValue:charStringArgument
                                        completion:^(NSError * _Nullable err) {
                                            NSLog(@"Write attribute char_string Not Default Value from saved value Error: %@", err);

                                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                            NextTest();
                                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeCharStringNotDefaultValueAndCompareToExpectedValue_100()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute char_string Not Default Value and compare to expected value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("char_string", actualValue, @"NotDefault"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeCharStringDefaultValue_101()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id charStringArgument;
        charStringArgument = [readAttributeCharStringDefaultValue copy];
        [cluster writeAttributeCharStringWithValue:charStringArgument
                                        completion:^(NSError * _Nullable err) {
                                            NSLog(@"Write attribute char_string Default Value Error: %@", err);

                                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                            NextTest();
                                        }];

        return CHIP_NO_ERROR;
    }
    NSData * _Nonnull readAttributeOctetStringDefaultValue;

    CHIP_ERROR TestReadAttributeOctetStringDefaultValue_102()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute octet_string Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("octet_string", actualValue, [[NSData alloc] initWithBytes:"" length:0]));
            }
            {
                readAttributeOctetStringDefaultValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeOctetStringDefaultValueAndCompareToSavedValue_103()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute octet_string Default Value and compare to saved value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("octet_string", actualValue, readAttributeOctetStringDefaultValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeOctetStringNotDefaultValue_104()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id octetStringArgument;
        octetStringArgument = [[NSData alloc] initWithBytes:"NotDefault" length:10];
        [cluster writeAttributeOctetStringWithValue:octetStringArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write attribute octet_string Not Default Value Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }
    NSData * _Nonnull readAttributeOctetStringNotDefaultValue;

    CHIP_ERROR TestReadAttributeOctetStringNotDefaultValue_105()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute octet_string Not Default Value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(
                    CheckValueAsString("octet_string", actualValue, [[NSData alloc] initWithBytes:"NotDefault" length:10]));
            }

            VerifyOrReturn(CheckConstraintNotValue("octetString", value, readAttributeOctetStringDefaultValue));
            {
                readAttributeOctetStringNotDefaultValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeOctetStringNotDefaultValueAndCompareToSavedValue_106()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute octet_string Not Default Value and compare to saved value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("octet_string", actualValue, readAttributeOctetStringNotDefaultValue));
            }

            VerifyOrReturn(CheckConstraintNotValue("octetString", value, readAttributeOctetStringDefaultValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeOctetStringNotDefaultValueFromSavedValue_107()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id octetStringArgument;
        octetStringArgument = [readAttributeOctetStringNotDefaultValue copy];
        [cluster
            writeAttributeOctetStringWithValue:octetStringArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Write attribute octet_string Not Default Value from saved value Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeOctetStringNotDefaultValueAndCompareToExpectedValue_108()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute octet_string Not Default Value and compare to expected value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(
                    CheckValueAsString("octet_string", actualValue, [[NSData alloc] initWithBytes:"NotDefault" length:10]));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeOctetStringDefaultValue_109()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id octetStringArgument;
        octetStringArgument = [readAttributeOctetStringDefaultValue copy];
        [cluster writeAttributeOctetStringWithValue:octetStringArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write attribute octet_string Default Value Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }
};

class TestConfigVariables : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestConfigVariables()
        : TestCommandBridge("TestConfigVariables")
        , mTestIndex(0)
    {
        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);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestConfigVariables() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestConfigVariables\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestConfigVariables\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Send Test Add Arguments Command\n");
            err = TestSendTestAddArgumentsCommand_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Send Test Add Arguments Command\n");
            err = TestSendTestAddArgumentsCommand_2();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 3;

    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;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }
    NSNumber * _Nonnull TestAddArgumentDefaultValue;

    CHIP_ERROR TestSendTestAddArgumentsCommand_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestAddArgumentsParams alloc] init];
        params.arg1 = [NSNumber numberWithUnsignedChar:3U];
        params.arg2 = [NSNumber numberWithUnsignedChar:17U];
        [cluster testAddArgumentsWithParams:params
                                 completion:^(MTRUnitTestingClusterTestAddArgumentsResponseParams * _Nullable values,
                                     NSError * _Nullable err) {
                                     NSLog(@"Send Test Add Arguments Command Error: %@", err);

                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                     {
                                         id actualValue = values.returnValue;
                                         VerifyOrReturn(CheckValue("returnValue", actualValue, 20U));
                                     }
                                     {
                                         TestAddArgumentDefaultValue = values.returnValue;
                                     }

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestAddArgumentsCommand_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRUnitTestingClusterTestAddArgumentsParams alloc] init];
        params.arg1 = mArg1.HasValue() ? [NSNumber numberWithUnsignedChar:mArg1.Value()] : [NSNumber numberWithUnsignedChar:5U];
        params.arg2 = [TestAddArgumentDefaultValue copy];
        [cluster testAddArgumentsWithParams:params
                                 completion:^(MTRUnitTestingClusterTestAddArgumentsResponseParams * _Nullable values,
                                     NSError * _Nullable err) {
                                     NSLog(@"Send Test Add Arguments Command Error: %@", err);

                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                     {
                                         id actualValue = values.returnValue;
                                         VerifyOrReturn(CheckValue("returnValue", actualValue,
                                             mReturnValueWithArg1.HasValue() ? mReturnValueWithArg1.Value() : 25U));
                                     }

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }
};

class TestDescriptorCluster : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestDescriptorCluster()
        : TestCommandBridge("TestDescriptorCluster")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestDescriptorCluster() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestDescriptorCluster\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestDescriptorCluster\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read attribute Device list\n");
            err = TestReadAttributeDeviceList_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read attribute Server list\n");
            err = TestReadAttributeServerList_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read attribute Client list\n");
            err = TestReadAttributeClientList_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read attribute Parts list\n");
            err = TestReadAttributePartsList_4();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 5;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadAttributeDeviceList_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeDeviceTypeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute Device list Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("DeviceTypeList", [actualValue count], static_cast<uint32_t>(1)));
                VerifyOrReturn(
                    CheckValue("DeviceType", ((MTRDescriptorClusterDeviceTypeStruct *) actualValue[0]).deviceType, 22UL));
                VerifyOrReturn(CheckValue("Revision", ((MTRDescriptorClusterDeviceTypeStruct *) actualValue[0]).revision, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeServerList_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeServerListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute Server list Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ServerList", [actualValue count], static_cast<uint32_t>(28)));
                VerifyOrReturn(CheckValue("", actualValue[0], 3UL));
                VerifyOrReturn(CheckValue("", actualValue[1], 4UL));
                VerifyOrReturn(CheckValue("", actualValue[2], 29UL));
                VerifyOrReturn(CheckValue("", actualValue[3], 30UL));
                VerifyOrReturn(CheckValue("", actualValue[4], 31UL));
                VerifyOrReturn(CheckValue("", actualValue[5], 40UL));
                VerifyOrReturn(CheckValue("", actualValue[6], 42UL));
                VerifyOrReturn(CheckValue("", actualValue[7], 43UL));
                VerifyOrReturn(CheckValue("", actualValue[8], 44UL));
                VerifyOrReturn(CheckValue("", actualValue[9], 45UL));
                VerifyOrReturn(CheckValue("", actualValue[10], 46UL));
                VerifyOrReturn(CheckValue("", actualValue[11], 47UL));
                VerifyOrReturn(CheckValue("", actualValue[12], 48UL));
                VerifyOrReturn(CheckValue("", actualValue[13], 49UL));
                VerifyOrReturn(CheckValue("", actualValue[14], 50UL));
                VerifyOrReturn(CheckValue("", actualValue[15], 51UL));
                VerifyOrReturn(CheckValue("", actualValue[16], 52UL));
                VerifyOrReturn(CheckValue("", actualValue[17], 53UL));
                VerifyOrReturn(CheckValue("", actualValue[18], 54UL));
                VerifyOrReturn(CheckValue("", actualValue[19], 55UL));
                VerifyOrReturn(CheckValue("", actualValue[20], 60UL));
                VerifyOrReturn(CheckValue("", actualValue[21], 62UL));
                VerifyOrReturn(CheckValue("", actualValue[22], 63UL));
                VerifyOrReturn(CheckValue("", actualValue[23], 64UL));
                VerifyOrReturn(CheckValue("", actualValue[24], 65UL));
                VerifyOrReturn(CheckValue("", actualValue[25], 1029UL));
                VerifyOrReturn(CheckValue("", actualValue[26], 4166UL));
                VerifyOrReturn(CheckValue("", actualValue[27], 4294048774UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeClientList_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClientListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute Client list Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClientList", [actualValue count], static_cast<uint32_t>(1)));
                VerifyOrReturn(CheckValue("", actualValue[0], 41UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributePartsList_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePartsListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read attribute Parts list Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("PartsList", [actualValue count], static_cast<uint32_t>(2)));
                VerifyOrReturn(CheckValue("", actualValue[0], 1U));
                VerifyOrReturn(CheckValue("", actualValue[1], 2U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class TestBasicInformation : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestBasicInformation()
        : TestCommandBridge("TestBasicInformation")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestBasicInformation() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestBasicInformation\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestBasicInformation\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read location\n");
            err = TestReadLocation_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Write location\n");
            err = TestWriteLocation_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read back location\n");
            err = TestReadBackLocation_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Restore initial location value\n");
            err = TestRestoreInitialLocationValue_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read AttributeList value\n");
            err = TestReadAttributeListValue_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read NodeLabel\n");
            err = TestReadNodeLabel_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Write NodeLabel\n");
            err = TestWriteNodeLabel_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read back NodeLabel\n");
            err = TestReadBackNodeLabel_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Read LocalConfigDisabled\n");
            err = TestReadLocalConfigDisabled_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Write LocalConfigDisabled\n");
            err = TestWriteLocalConfigDisabled_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Read back LocalConfigDisabled\n");
            err = TestReadBackLocalConfigDisabled_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Reboot the device\n");
            err = TestRebootTheDevice_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Connect to the device again\n");
            err = TestConnectToTheDeviceAgain_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Read back NodeLabel after reboot\n");
            err = TestReadBackNodeLabelAfterReboot_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Restore initial NodeLabel value\n");
            err = TestRestoreInitialNodeLabelValue_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Read back LocalConfigDisabled after reboot\n");
            err = TestReadBackLocalConfigDisabledAfterReboot_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Restore initial LocalConfigDisabled value\n");
            err = TestRestoreInitialLocalConfigDisabledValue_17();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 18;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadLocation_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBasicInformation alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLocationWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read location Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("Location", actualValue, @"XX"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteLocation_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBasicInformation alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id locationArgument;
        locationArgument = @"US";
        [cluster writeAttributeLocationWithValue:locationArgument
                                      completion:^(NSError * _Nullable err) {
                                          NSLog(@"Write location Error: %@", err);

                                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                          NextTest();
                                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackLocation_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBasicInformation alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLocationWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back location Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("Location", actualValue, @"US"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRestoreInitialLocationValue_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBasicInformation alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id locationArgument;
        locationArgument = @"XX";
        [cluster writeAttributeLocationWithValue:locationArgument
                                      completion:^(NSError * _Nullable err) {
                                          NSLog(@"Restore initial location value Error: %@", err);

                                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                          NextTest();
                                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeListValue_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBasicInformation alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read AttributeList value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AttributeList", [actualValue count], static_cast<uint32_t>(25)));
                VerifyOrReturn(CheckValue("", actualValue[0], 0UL));
                VerifyOrReturn(CheckValue("", actualValue[1], 1UL));
                VerifyOrReturn(CheckValue("", actualValue[2], 2UL));
                VerifyOrReturn(CheckValue("", actualValue[3], 3UL));
                VerifyOrReturn(CheckValue("", actualValue[4], 4UL));
                VerifyOrReturn(CheckValue("", actualValue[5], 5UL));
                VerifyOrReturn(CheckValue("", actualValue[6], 6UL));
                VerifyOrReturn(CheckValue("", actualValue[7], 7UL));
                VerifyOrReturn(CheckValue("", actualValue[8], 8UL));
                VerifyOrReturn(CheckValue("", actualValue[9], 9UL));
                VerifyOrReturn(CheckValue("", actualValue[10], 10UL));
                VerifyOrReturn(CheckValue("", actualValue[11], 11UL));
                VerifyOrReturn(CheckValue("", actualValue[12], 12UL));
                VerifyOrReturn(CheckValue("", actualValue[13], 13UL));
                VerifyOrReturn(CheckValue("", actualValue[14], 14UL));
                VerifyOrReturn(CheckValue("", actualValue[15], 15UL));
                VerifyOrReturn(CheckValue("", actualValue[16], 16UL));
                VerifyOrReturn(CheckValue("", actualValue[17], 17UL));
                VerifyOrReturn(CheckValue("", actualValue[18], 18UL));
                VerifyOrReturn(CheckValue("", actualValue[19], 19UL));
                VerifyOrReturn(CheckValue("", actualValue[20], 65528UL));
                VerifyOrReturn(CheckValue("", actualValue[21], 65529UL));
                VerifyOrReturn(CheckValue("", actualValue[22], 65531UL));
                VerifyOrReturn(CheckValue("", actualValue[23], 65532UL));
                VerifyOrReturn(CheckValue("", actualValue[24], 65533UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadNodeLabel_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBasicInformation alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNodeLabelWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read NodeLabel Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("NodeLabel", actualValue, @""));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteNodeLabel_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBasicInformation alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nodeLabelArgument;
        nodeLabelArgument = @"My node";
        [cluster writeAttributeNodeLabelWithValue:nodeLabelArgument
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(@"Write NodeLabel Error: %@", err);

                                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackNodeLabel_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBasicInformation alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNodeLabelWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back NodeLabel Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("NodeLabel", actualValue, @"My node"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadLocalConfigDisabled_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBasicInformation alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLocalConfigDisabledWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read LocalConfigDisabled Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("LocalConfigDisabled", actualValue, false));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteLocalConfigDisabled_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBasicInformation alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id localConfigDisabledArgument;
        localConfigDisabledArgument = [NSNumber numberWithBool:true];
        [cluster writeAttributeLocalConfigDisabledWithValue:localConfigDisabledArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"Write LocalConfigDisabled Error: %@", err);

                                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackLocalConfigDisabled_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBasicInformation alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLocalConfigDisabledWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back LocalConfigDisabled Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("LocalConfigDisabled", actualValue, true));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRebootTheDevice_12()
    {

        chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
        return Reboot("alpha", value);
    }

    CHIP_ERROR TestConnectToTheDeviceAgain_13()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadBackNodeLabelAfterReboot_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBasicInformation alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNodeLabelWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back NodeLabel after reboot Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("NodeLabel", actualValue, @"My node"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRestoreInitialNodeLabelValue_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBasicInformation alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nodeLabelArgument;
        nodeLabelArgument = @"";
        [cluster writeAttributeNodeLabelWithValue:nodeLabelArgument
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(@"Restore initial NodeLabel value Error: %@", err);

                                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackLocalConfigDisabledAfterReboot_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBasicInformation alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLocalConfigDisabledWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back LocalConfigDisabled after reboot Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("LocalConfigDisabled", actualValue, true));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRestoreInitialLocalConfigDisabledValue_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBasicInformation alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id localConfigDisabledArgument;
        localConfigDisabledArgument = [NSNumber numberWithBool:false];
        [cluster writeAttributeLocalConfigDisabledWithValue:localConfigDisabledArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"Restore initial LocalConfigDisabled value Error: %@", err);

                                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }
};

class TestFabricRemovalWhileSubscribed : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestFabricRemovalWhileSubscribed()
        : TestCommandBridge("TestFabricRemovalWhileSubscribed")
        , mTestIndex(0)
    {
        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);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestFabricRemovalWhileSubscribed() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestFabricRemovalWhileSubscribed\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestFabricRemovalWhileSubscribed\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read number of commissioned fabrics\n");
            err = TestReadNumberOfCommissionedFabrics_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read current fabric index\n");
            err = TestReadCurrentFabricIndex_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Open commissioning window from alpha\n");
            err = TestOpenCommissioningWindowFromAlpha_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Commission from beta\n");
            err = TestCommissionFromBeta_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Wait for the commissioned device to be retrieved for beta\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrievedForBeta_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Report: Subscribe Fabrics Attribute from beta\n");
            err = TestReportSubscribeFabricsAttributeFromBeta_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Subscribe Fabrics Attribute from beta\n");
            err = TestSubscribeFabricsAttributeFromBeta_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Remove single own fabric\n");
            err = TestRemoveSingleOwnFabric_8();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 9;

    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_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadNumberOfCommissionedFabrics_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCommissionedFabricsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read number of commissioned fabrics Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CommissionedFabrics", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("commissionedFabrics", "int8u", "int8u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull ourFabricIndex;

    CHIP_ERROR TestReadCurrentFabricIndex_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentFabricIndexWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read current fabric index Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("currentFabricIndex", "int8u", "int8u"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentFabricIndex", [value unsignedCharValue], 1U));
            {
                ourFabricIndex = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestOpenCommissioningWindowFromAlpha_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRAdministratorCommissioningClusterOpenBasicCommissioningWindowParams alloc] init];
        params.commissioningTimeout = [NSNumber numberWithUnsignedShort:180U];
        [cluster openBasicCommissioningWindowWithParams:params
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"Open commissioning window from alpha Error: %@", err);

                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCommissionFromBeta_4()
    {

        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("beta", value);
    }

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrievedForBeta_5()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = 74565ULL;
        return WaitForCommissionee("beta", value);
    }
    bool testSendClusterTestFabricRemovalWhileSubscribed_6_WaitForReport_Fulfilled = false;
    ResponseHandler _Nullable test_TestFabricRemovalWhileSubscribed_Fabrics_Reported = nil;

    CHIP_ERROR TestReportSubscribeFabricsAttributeFromBeta_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        test_TestFabricRemovalWhileSubscribed_Fabrics_Reported = ^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Report: Subscribe Fabrics Attribute from beta Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("fabrics", "list", "list"));
            testSendClusterTestFabricRemovalWhileSubscribed_6_WaitForReport_Fulfilled = true;
        };

        NextTest();
        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSubscribeFabricsAttributeFromBeta_7()
    {

        MTRBaseDevice * device = GetDevice("beta");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        uint16_t minIntervalArgument = 2U;
        uint16_t maxIntervalArgument = 5U;
        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(minIntervalArgument)
                                                                   maxInterval:@(maxIntervalArgument)];
        params.filterByFabric = true;
        params.replaceExistingSubscriptions = true;
        [cluster subscribeAttributeFabricsWithParams:params
            subscriptionEstablished:^{
                VerifyOrReturn(testSendClusterTestFabricRemovalWhileSubscribed_6_WaitForReport_Fulfilled,
                    SetCommandExitStatus(CHIP_ERROR_INCORRECT_STATE));
                NextTest();
            }
            reportHandler:^(NSArray * _Nullable value, NSError * _Nullable err) {
                NSLog(@"Subscribe Fabrics Attribute from beta Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
                if (test_TestFabricRemovalWhileSubscribed_Fabrics_Reported != nil) {
                    ResponseHandler callback = test_TestFabricRemovalWhileSubscribed_Fabrics_Reported;
                    test_TestFabricRemovalWhileSubscribed_Fabrics_Reported = nil;
                    callback(value, err);
                }
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRemoveSingleOwnFabric_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTROperationalCredentialsClusterRemoveFabricParams alloc] init];
        params.fabricIndex = [ourFabricIndex copy];
        [cluster removeFabricWithParams:params
                             completion:^(
                                 MTROperationalCredentialsClusterNOCResponseParams * _Nullable values, NSError * _Nullable err) {
                                 NSLog(@"Remove single own fabric Error: %@", err);

                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                 NextTest();
                             }];

        return CHIP_NO_ERROR;
    }
};

class TestGeneralCommissioning : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestGeneralCommissioning()
        : TestCommandBridge("TestGeneralCommissioning")
        , mTestIndex(0)
    {
        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);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestGeneralCommissioning() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestGeneralCommissioning\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestGeneralCommissioning\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Write Breadcrumb (1/2)\n");
            err = TestWriteBreadcrumb12_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read back Breadcrumb (1/2)\n");
            err = TestReadBackBreadcrumb12_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Write Breadcrumb (2/2)\n");
            err = TestWriteBreadcrumb22_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read back Breadcrumb (2/2)\n");
            err = TestReadBackBreadcrumb22_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Reboot to reset Breadcrumb\n");
            err = TestRebootToResetBreadcrumb_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Connect to the device again\n");
            err = TestConnectToTheDeviceAgain_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read back Breadcrumb after reboot and ensure it was not persisted\n");
            err = TestReadBackBreadcrumbAfterRebootAndEnsureItWasNotPersisted_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Set Breadcrumb to nonzero value\n");
            err = TestSetBreadcrumbToNonzeroValue_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Check Breadcrumb set worked\n");
            err = TestCheckBreadcrumbSetWorked_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Send CommissioningComplete without armed fail-safe\n");
            err = TestSendCommissioningCompleteWithoutArmedFailSafe_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Check Breadcrumb was not touched by invalid CommissioningComplete\n");
            err = TestCheckBreadcrumbWasNotTouchedByInvalidCommissioningComplete_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Open Commissioning Window from alpha\n");
            err = TestOpenCommissioningWindowFromAlpha_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Try to arm fail-safe\n");
            err = TestTryToArmFailSafe_13();
            break;
        case 14:
            ChipLogProgress(
                chipTool, " ***** Test Step 14 : Check Breadcrumb was not touched by ArmFailSafe with commissioning window open\n");
            err = TestCheckBreadcrumbWasNotTouchedByArmFailSafeWithCommissioningWindowOpen_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Reset Breadcrumb to 0 so we can commission\n");
            err = TestResetBreadcrumbTo0SoWeCanCommission_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Commission from beta\n");
            err = TestCommissionFromBeta_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Wait for the commissioned device to be retrieved for beta\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrievedForBeta_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Arm fail-safe\n");
            err = TestArmFailSafe_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Check Breadcrumb was properly set by ArmFailSafe\n");
            err = TestCheckBreadcrumbWasProperlySetByArmFailSafe_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Try to arm fail-safe from wrong fabric\n");
            err = TestTryToArmFailSafeFromWrongFabric_20();
            break;
        case 21:
            ChipLogProgress(
                chipTool, " ***** Test Step 21 : Check Breadcrumb was not touched by ArmFailSafe with existing fail-safe armed\n");
            err = TestCheckBreadcrumbWasNotTouchedByArmFailSafeWithExistingFailSafeArmed_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : Send CommissioningComplete from wrong fabric\n");
            err = TestSendCommissioningCompleteFromWrongFabric_22();
            break;
        case 23:
            ChipLogProgress(
                chipTool, " ***** Test Step 23 : Check Breadcrumb was not touched by CommissioningComplete from wrong fabric\n");
            err = TestCheckBreadcrumbWasNotTouchedByCommissioningCompleteFromWrongFabric_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : Close out the fail-safe gracefully\n");
            err = TestCloseOutTheFailSafeGracefully_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : Check Breadcrumb was reset to 0 by CommissioningComplete\n");
            err = TestCheckBreadcrumbWasResetTo0ByCommissioningComplete_25();
            break;
        case 26:
            ChipLogProgress(chipTool, " ***** Test Step 26 : Arm fail-safe again\n");
            err = TestArmFailSafeAgain_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : Check Breadcrumb was set by arming fail-safe again\n");
            err = TestCheckBreadcrumbWasSetByArmingFailSafeAgain_27();
            break;
        case 28:
            ChipLogProgress(chipTool, " ***** Test Step 28 : Force-expire the fail-safe\n");
            err = TestForceExpireTheFailSafe_28();
            break;
        case 29:
            ChipLogProgress(chipTool, " ***** Test Step 29 : Check Breadcrumb was reset by expiring the fail-safe\n");
            err = TestCheckBreadcrumbWasResetByExpiringTheFailSafe_29();
            break;
        case 30:
            ChipLogProgress(chipTool, " ***** Test Step 30 : Validate presence of SupportsConcurrentConnection\n");
            err = TestValidatePresenceOfSupportsConcurrentConnection_30();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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));
            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));
            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));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 31;

    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_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestWriteBreadcrumb12_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id breadcrumbArgument;
        breadcrumbArgument = [NSNumber numberWithUnsignedLongLong:137438953472ULL];
        [cluster writeAttributeBreadcrumbWithValue:breadcrumbArgument
                                        completion:^(NSError * _Nullable err) {
                                            NSLog(@"Write Breadcrumb (1/2) Error: %@", err);

                                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                            NextTest();
                                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackBreadcrumb12_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBreadcrumbWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back Breadcrumb (1/2) Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("Breadcrumb", actualValue, 137438953472ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteBreadcrumb22_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id breadcrumbArgument;
        breadcrumbArgument = [NSNumber numberWithUnsignedLongLong:81ULL];
        [cluster writeAttributeBreadcrumbWithValue:breadcrumbArgument
                                        completion:^(NSError * _Nullable err) {
                                            NSLog(@"Write Breadcrumb (2/2) Error: %@", err);

                                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                            NextTest();
                                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackBreadcrumb22_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBreadcrumbWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back Breadcrumb (2/2) Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("Breadcrumb", actualValue, 81ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRebootToResetBreadcrumb_5()
    {

        chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
        return Reboot("alpha", value);
    }

    CHIP_ERROR TestConnectToTheDeviceAgain_6()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadBackBreadcrumbAfterRebootAndEnsureItWasNotPersisted_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBreadcrumbWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back Breadcrumb after reboot and ensure it was not persisted Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("Breadcrumb", actualValue, 0ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSetBreadcrumbToNonzeroValue_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id breadcrumbArgument;
        breadcrumbArgument = [NSNumber numberWithUnsignedLongLong:1ULL];
        [cluster writeAttributeBreadcrumbWithValue:breadcrumbArgument
                                        completion:^(NSError * _Nullable err) {
                                            NSLog(@"Set Breadcrumb to nonzero value Error: %@", err);

                                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                            NextTest();
                                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckBreadcrumbSetWorked_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBreadcrumbWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check Breadcrumb set worked Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("Breadcrumb", actualValue, 1ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendCommissioningCompleteWithoutArmedFailSafe_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster commissioningCompleteWithCompletion:^(
            MTRGeneralCommissioningClusterCommissioningCompleteResponseParams * _Nullable values, NSError * _Nullable err) {
            NSLog(@"Send CommissioningComplete without armed fail-safe Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = values.errorCode;
                VerifyOrReturn(CheckValue("ErrorCode", actualValue, 3U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckBreadcrumbWasNotTouchedByInvalidCommissioningComplete_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBreadcrumbWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check Breadcrumb was not touched by invalid CommissioningComplete Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("Breadcrumb", actualValue, 1ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestOpenCommissioningWindowFromAlpha_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRAdministratorCommissioningClusterOpenBasicCommissioningWindowParams alloc] init];
        params.commissioningTimeout = [NSNumber numberWithUnsignedShort:180U];
        [cluster openBasicCommissioningWindowWithParams:params
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"Open Commissioning Window from alpha Error: %@", err);

                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTryToArmFailSafe_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGeneralCommissioningClusterArmFailSafeParams alloc] init];
        params.expiryLengthSeconds = [NSNumber numberWithUnsignedShort:10U];
        params.breadcrumb = [NSNumber numberWithUnsignedLongLong:5000ULL];
        [cluster armFailSafeWithParams:params
                            completion:^(MTRGeneralCommissioningClusterArmFailSafeResponseParams * _Nullable values,
                                NSError * _Nullable err) {
                                NSLog(@"Try to arm fail-safe Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                {
                                    id actualValue = values.errorCode;
                                    VerifyOrReturn(CheckValue("ErrorCode", actualValue, 4U));
                                }

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckBreadcrumbWasNotTouchedByArmFailSafeWithCommissioningWindowOpen_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBreadcrumbWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check Breadcrumb was not touched by ArmFailSafe with commissioning window open Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("Breadcrumb", actualValue, 1ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestResetBreadcrumbTo0SoWeCanCommission_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id breadcrumbArgument;
        breadcrumbArgument = [NSNumber numberWithUnsignedLongLong:0ULL];
        [cluster writeAttributeBreadcrumbWithValue:breadcrumbArgument
                                        completion:^(NSError * _Nullable err) {
                                            NSLog(@"Reset Breadcrumb to 0 so we can commission Error: %@", err);

                                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                            NextTest();
                                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCommissionFromBeta_16()
    {

        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("beta", value);
    }

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrievedForBeta_17()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = 74565ULL;
        return WaitForCommissionee("beta", value);
    }

    CHIP_ERROR TestArmFailSafe_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGeneralCommissioningClusterArmFailSafeParams alloc] init];
        params.expiryLengthSeconds = [NSNumber numberWithUnsignedShort:500U];
        params.breadcrumb = [NSNumber numberWithUnsignedLongLong:2ULL];
        [cluster armFailSafeWithParams:params
                            completion:^(MTRGeneralCommissioningClusterArmFailSafeResponseParams * _Nullable values,
                                NSError * _Nullable err) {
                                NSLog(@"Arm fail-safe Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                {
                                    id actualValue = values.errorCode;
                                    VerifyOrReturn(CheckValue("ErrorCode", actualValue, 0U));
                                }

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckBreadcrumbWasProperlySetByArmFailSafe_19()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBreadcrumbWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check Breadcrumb was properly set by ArmFailSafe Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("Breadcrumb", actualValue, 2ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTryToArmFailSafeFromWrongFabric_20()
    {

        MTRBaseDevice * device = GetDevice("beta");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGeneralCommissioningClusterArmFailSafeParams alloc] init];
        params.expiryLengthSeconds = [NSNumber numberWithUnsignedShort:10U];
        params.breadcrumb = [NSNumber numberWithUnsignedLongLong:5000ULL];
        [cluster armFailSafeWithParams:params
                            completion:^(MTRGeneralCommissioningClusterArmFailSafeResponseParams * _Nullable values,
                                NSError * _Nullable err) {
                                NSLog(@"Try to arm fail-safe from wrong fabric Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                {
                                    id actualValue = values.errorCode;
                                    VerifyOrReturn(CheckValue("ErrorCode", actualValue, 4U));
                                }

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckBreadcrumbWasNotTouchedByArmFailSafeWithExistingFailSafeArmed_21()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBreadcrumbWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check Breadcrumb was not touched by ArmFailSafe with existing fail-safe armed Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("Breadcrumb", actualValue, 2ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendCommissioningCompleteFromWrongFabric_22()
    {

        MTRBaseDevice * device = GetDevice("beta");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster commissioningCompleteWithCompletion:^(
            MTRGeneralCommissioningClusterCommissioningCompleteResponseParams * _Nullable values, NSError * _Nullable err) {
            NSLog(@"Send CommissioningComplete from wrong fabric Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = values.errorCode;
                VerifyOrReturn(CheckValue("ErrorCode", actualValue, 2U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckBreadcrumbWasNotTouchedByCommissioningCompleteFromWrongFabric_23()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBreadcrumbWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check Breadcrumb was not touched by CommissioningComplete from wrong fabric Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("Breadcrumb", actualValue, 2ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCloseOutTheFailSafeGracefully_24()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster commissioningCompleteWithCompletion:^(
            MTRGeneralCommissioningClusterCommissioningCompleteResponseParams * _Nullable values, NSError * _Nullable err) {
            NSLog(@"Close out the fail-safe gracefully Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = values.errorCode;
                VerifyOrReturn(CheckValue("ErrorCode", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckBreadcrumbWasResetTo0ByCommissioningComplete_25()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBreadcrumbWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check Breadcrumb was reset to 0 by CommissioningComplete Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("Breadcrumb", actualValue, 0ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestArmFailSafeAgain_26()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGeneralCommissioningClusterArmFailSafeParams alloc] init];
        params.expiryLengthSeconds = [NSNumber numberWithUnsignedShort:500U];
        params.breadcrumb = [NSNumber numberWithUnsignedLongLong:3ULL];
        [cluster armFailSafeWithParams:params
                            completion:^(MTRGeneralCommissioningClusterArmFailSafeResponseParams * _Nullable values,
                                NSError * _Nullable err) {
                                NSLog(@"Arm fail-safe again Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                {
                                    id actualValue = values.errorCode;
                                    VerifyOrReturn(CheckValue("ErrorCode", actualValue, 0U));
                                }

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckBreadcrumbWasSetByArmingFailSafeAgain_27()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBreadcrumbWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check Breadcrumb was set by arming fail-safe again Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("Breadcrumb", actualValue, 3ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestForceExpireTheFailSafe_28()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGeneralCommissioningClusterArmFailSafeParams alloc] init];
        params.expiryLengthSeconds = [NSNumber numberWithUnsignedShort:0U];
        params.breadcrumb = [NSNumber numberWithUnsignedLongLong:4ULL];
        [cluster armFailSafeWithParams:params
                            completion:^(MTRGeneralCommissioningClusterArmFailSafeResponseParams * _Nullable values,
                                NSError * _Nullable err) {
                                NSLog(@"Force-expire the fail-safe Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                {
                                    id actualValue = values.errorCode;
                                    VerifyOrReturn(CheckValue("ErrorCode", actualValue, 0U));
                                }

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckBreadcrumbWasResetByExpiringTheFailSafe_29()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBreadcrumbWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check Breadcrumb was reset by expiring the fail-safe Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("Breadcrumb", actualValue, 0ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestValidatePresenceOfSupportsConcurrentConnection_30()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSupportsConcurrentConnectionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Validate presence of SupportsConcurrentConnection Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("supportsConcurrentConnection", "boolean", "boolean"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class TestIdentifyCluster : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestIdentifyCluster()
        : TestCommandBridge("TestIdentifyCluster")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestIdentifyCluster() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestIdentifyCluster\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestIdentifyCluster\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Send Identify command and expect success response\n");
            err = TestSendIdentifyCommandAndExpectSuccessResponse_1();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 2;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestSendIdentifyCommandAndExpectSuccessResponse_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRIdentifyClusterIdentifyParams alloc] init];
        params.identifyTime = [NSNumber numberWithUnsignedShort:0U];
        [cluster identifyWithParams:params
                         completion:^(NSError * _Nullable err) {
                             NSLog(@"Send Identify command and expect success response Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }
};

class TestOperationalCredentialsCluster : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestOperationalCredentialsCluster()
        : TestCommandBridge("TestOperationalCredentialsCluster")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestOperationalCredentialsCluster() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestOperationalCredentialsCluster\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestOperationalCredentialsCluster\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read number of supported fabrics\n");
            err = TestReadNumberOfSupportedFabrics_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read number of commissioned fabrics\n");
            err = TestReadNumberOfCommissionedFabrics_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read current fabric index\n");
            err = TestReadCurrentFabricIndex_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Remove nonexistent fabric\n");
            err = TestRemoveNonexistentFabric_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read fabric list before setting label\n");
            err = TestReadFabricListBeforeSettingLabel_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Set the fabric label\n");
            err = TestSetTheFabricLabel_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read fabric list after setting label\n");
            err = TestReadFabricListAfterSettingLabel_7();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 8;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadNumberOfSupportedFabrics_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSupportedFabricsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read number of supported fabrics Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("supportedFabrics", "int8u", "int8u"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("supportedFabrics", [value unsignedCharValue], 4U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadNumberOfCommissionedFabrics_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCommissionedFabricsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read number of commissioned fabrics Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("commissionedFabrics", "int8u", "int8u"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("commissionedFabrics", [value unsignedCharValue], 1U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull ourFabricIndex;

    CHIP_ERROR TestReadCurrentFabricIndex_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentFabricIndexWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read current fabric index Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("currentFabricIndex", "int8u", "int8u"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentFabricIndex", [value unsignedCharValue], 1U));
            {
                ourFabricIndex = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRemoveNonexistentFabric_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTROperationalCredentialsClusterRemoveFabricParams alloc] init];
        params.fabricIndex = [NSNumber numberWithUnsignedChar:243U];
        [cluster removeFabricWithParams:params
                             completion:^(
                                 MTROperationalCredentialsClusterNOCResponseParams * _Nullable values, NSError * _Nullable err) {
                                 NSLog(@"Remove nonexistent fabric Error: %@", err);

                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                 {
                                     id actualValue = values.statusCode;
                                     VerifyOrReturn(CheckValue("StatusCode", actualValue, 11U));
                                 }

                                 NextTest();
                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadFabricListBeforeSettingLabel_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRReadParams alloc] init];
        params.filterByFabric = true;
        [cluster
            readAttributeFabricsWithParams:params
                                completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                    NSLog(@"Read fabric list before setting label Error: %@", err);

                                    VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                    {
                                        id actualValue = value;
                                        VerifyOrReturn(CheckValue("Fabrics", [actualValue count], static_cast<uint32_t>(1)));
                                        VerifyOrReturn(CheckValueAsString("Label",
                                            ((MTROperationalCredentialsClusterFabricDescriptorStruct *) actualValue[0]).label,
                                            @""));
                                        VerifyOrReturn(CheckValue("FabricIndex",
                                            ((MTROperationalCredentialsClusterFabricDescriptorStruct *) actualValue[0]).fabricIndex,
                                            ourFabricIndex));
                                    }

                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSetTheFabricLabel_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTROperationalCredentialsClusterUpdateFabricLabelParams alloc] init];
        params.label = @"Batcave";
        [cluster updateFabricLabelWithParams:params
                                  completion:^(MTROperationalCredentialsClusterNOCResponseParams * _Nullable values,
                                      NSError * _Nullable err) {
                                      NSLog(@"Set the fabric label Error: %@", err);

                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                      {
                                          id actualValue = values.statusCode;
                                          VerifyOrReturn(CheckValue("StatusCode", actualValue, 0U));
                                      }

                                      {
                                          id actualValue = values.fabricIndex;
                                          VerifyOrReturn(CheckValue("FabricIndex", actualValue, ourFabricIndex));
                                      }

                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadFabricListAfterSettingLabel_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRReadParams alloc] init];
        params.filterByFabric = true;
        [cluster
            readAttributeFabricsWithParams:params
                                completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                    NSLog(@"Read fabric list after setting label Error: %@", err);

                                    VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                    {
                                        id actualValue = value;
                                        VerifyOrReturn(CheckValue("Fabrics", [actualValue count], static_cast<uint32_t>(1)));
                                        VerifyOrReturn(CheckValueAsString("Label",
                                            ((MTROperationalCredentialsClusterFabricDescriptorStruct *) actualValue[0]).label,
                                            @"Batcave"));
                                        VerifyOrReturn(CheckValue("FabricIndex",
                                            ((MTROperationalCredentialsClusterFabricDescriptorStruct *) actualValue[0]).fabricIndex,
                                            ourFabricIndex));
                                    }

                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }
};

class TestModeSelectCluster : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestModeSelectCluster()
        : TestCommandBridge("TestModeSelectCluster")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestModeSelectCluster() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestModeSelectCluster\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestModeSelectCluster\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read Description\n");
            err = TestReadDescription_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read StandardNamespace\n");
            err = TestReadStandardNamespace_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read SupportedModes\n");
            err = TestReadSupportedModes_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read CurrentMode\n");
            err = TestReadCurrentMode_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read StartUpMode\n");
            err = TestReadStartUpMode_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read OnMode\n");
            err = TestReadOnMode_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Change to Supported Mode\n");
            err = TestChangeToSupportedMode_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Verify Current Mode Change\n");
            err = TestVerifyCurrentModeChange_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Change to Unsupported Mode\n");
            err = TestChangeToUnsupportedMode_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Toggle OnOff\n");
            err = TestToggleOnOff_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Toggle OnOff\n");
            err = TestToggleOnOff_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Verify Current Mode does not change when OnMode is null\n");
            err = TestVerifyCurrentModeDoesNotChangeWhenOnModeIsNull_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Change to Unsupported OnMode\n");
            err = TestChangeToUnsupportedOnMode_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Change OnMode\n");
            err = TestChangeOnMode_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Verify OnMode\n");
            err = TestVerifyOnMode_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Toggle OnOff\n");
            err = TestToggleOnOff_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Toggle OnOff\n");
            err = TestToggleOnOff_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Verify Current Mode Changes if OnMode is not null\n");
            err = TestVerifyCurrentModeChangesIfOnModeIsNotNull_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Change to Unsupported StartUp Mode\n");
            err = TestChangeToUnsupportedStartUpMode_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Change to Supported StartUp Mode\n");
            err = TestChangeToSupportedStartUpMode_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Verify StartUp Mode Change\n");
            err = TestVerifyStartUpModeChange_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : Change CurrentMode to another value\n");
            err = TestChangeCurrentModeToAnotherValue_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : Change On Mode\n");
            err = TestChangeOnMode_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : Set StartUpOnOff\n");
            err = TestSetStartUpOnOff_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : Reboot target device\n");
            err = TestRebootTargetDevice_25();
            break;
        case 26:
            ChipLogProgress(chipTool, " ***** Test Step 26 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_26();
            break;
        case 27:
            ChipLogProgress(
                chipTool, " ***** Test Step 27 : Verify Current Mode Change based on OnMode, as it overwrites StartUpMode\n");
            err = TestVerifyCurrentModeChangeBasedOnOnModeAsItOverwritesStartUpMode_27();
            break;
        case 28:
            ChipLogProgress(chipTool, " ***** Test Step 28 : Change On Mode to Null\n");
            err = TestChangeOnModeToNull_28();
            break;
        case 29:
            ChipLogProgress(chipTool, " ***** Test Step 29 : Reboot target device\n");
            err = TestRebootTargetDevice_29();
            break;
        case 30:
            ChipLogProgress(chipTool, " ***** Test Step 30 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_30();
            break;
        case 31:
            ChipLogProgress(chipTool, " ***** Test Step 31 : Verify Current Mode Change based on new StartUp Mode\n");
            err = TestVerifyCurrentModeChangeBasedOnNewStartUpMode_31();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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));
            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));
            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));
            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));
            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));
            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));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 32;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadDescription_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeDescriptionWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read Description Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("Description", actualValue, @"Coffee"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadStandardNamespace_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeStandardNamespaceWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read StandardNamespace Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("StandardNamespace", actualValue));
                VerifyOrReturn(CheckValue("StandardNamespace", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadSupportedModes_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSupportedModesWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read SupportedModes Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("SupportedModes", [actualValue count], static_cast<uint32_t>(3)));
                VerifyOrReturn(
                    CheckValueAsString("Label", ((MTRModeSelectClusterModeOptionStruct *) actualValue[0]).label, @"Black"));
                VerifyOrReturn(CheckValue("Mode", ((MTRModeSelectClusterModeOptionStruct *) actualValue[0]).mode, 0U));
                VerifyOrReturn(CheckValue("SemanticTags",
                    [((MTRModeSelectClusterModeOptionStruct *) actualValue[0]).semanticTags count], static_cast<uint32_t>(1)));
                VerifyOrReturn(CheckValue("Value",
                    ((MTRModeSelectClusterSemanticTagStruct *) ((MTRModeSelectClusterModeOptionStruct *) actualValue[0])
                            .semanticTags[0])
                        .value,
                    0U));
                VerifyOrReturn(
                    CheckValueAsString("Label", ((MTRModeSelectClusterModeOptionStruct *) actualValue[1]).label, @"Cappuccino"));
                VerifyOrReturn(CheckValue("Mode", ((MTRModeSelectClusterModeOptionStruct *) actualValue[1]).mode, 4U));
                VerifyOrReturn(CheckValue("SemanticTags",
                    [((MTRModeSelectClusterModeOptionStruct *) actualValue[1]).semanticTags count], static_cast<uint32_t>(1)));
                VerifyOrReturn(CheckValue("Value",
                    ((MTRModeSelectClusterSemanticTagStruct *) ((MTRModeSelectClusterModeOptionStruct *) actualValue[1])
                            .semanticTags[0])
                        .value,
                    0U));
                VerifyOrReturn(
                    CheckValueAsString("Label", ((MTRModeSelectClusterModeOptionStruct *) actualValue[2]).label, @"Espresso"));
                VerifyOrReturn(CheckValue("Mode", ((MTRModeSelectClusterModeOptionStruct *) actualValue[2]).mode, 7U));
                VerifyOrReturn(CheckValue("SemanticTags",
                    [((MTRModeSelectClusterModeOptionStruct *) actualValue[2]).semanticTags count], static_cast<uint32_t>(1)));
                VerifyOrReturn(CheckValue("Value",
                    ((MTRModeSelectClusterSemanticTagStruct *) ((MTRModeSelectClusterModeOptionStruct *) actualValue[2])
                            .semanticTags[0])
                        .value,
                    0U));
            }

            VerifyOrReturn(CheckConstraintType("supportedModes", "list", "list"));
            VerifyOrReturn(CheckConstraintMinLength("supportedModes", value, 3));
            VerifyOrReturn(CheckConstraintMaxLength("supportedModes", value, 3));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadCurrentMode_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read CurrentMode Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentMode", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadStartUpMode_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeStartUpModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read StartUpMode Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("StartUpMode", actualValue));
                VerifyOrReturn(CheckValue("StartUpMode", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadOnMode_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read OnMode Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("OnMode", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestChangeToSupportedMode_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRModeSelectClusterChangeToModeParams alloc] init];
        params.newMode = [NSNumber numberWithUnsignedChar:4U];
        [cluster changeToModeWithParams:params
                             completion:^(NSError * _Nullable err) {
                                 NSLog(@"Change to Supported Mode Error: %@", err);

                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                 NextTest();
                             }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull currentModeBeforeToggle;

    CHIP_ERROR TestVerifyCurrentModeChange_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify Current Mode Change Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentMode", actualValue, 4U));
            }
            {
                currentModeBeforeToggle = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestChangeToUnsupportedMode_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRModeSelectClusterChangeToModeParams alloc] init];
        params.newMode = [NSNumber numberWithUnsignedChar:2U];
        [cluster
            changeToModeWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"Change to Unsupported Mode Error: %@", err);

                            VerifyOrReturn(CheckValue("status",
                                err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                    : 0,
                                EMBER_ZCL_STATUS_INVALID_COMMAND));
                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestToggleOnOff_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Toggle OnOff Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestToggleOnOff_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Toggle OnOff Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyCurrentModeDoesNotChangeWhenOnModeIsNull_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify Current Mode does not change when OnMode is null Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentMode", actualValue, currentModeBeforeToggle));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestChangeToUnsupportedOnMode_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id onModeArgument;
        onModeArgument = [NSNumber numberWithUnsignedChar:2U];
        [cluster
            writeAttributeOnModeWithValue:onModeArgument
                               completion:^(NSError * _Nullable err) {
                                   NSLog(@"Change to Unsupported OnMode Error: %@", err);

                                   VerifyOrReturn(CheckValue("status",
                                       err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                     : EMBER_ZCL_STATUS_FAILURE)
                                           : 0,
                                       EMBER_ZCL_STATUS_INVALID_COMMAND));
                                   NextTest();
                               }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestChangeOnMode_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id onModeArgument;
        onModeArgument = [NSNumber numberWithUnsignedChar:7U];
        [cluster writeAttributeOnModeWithValue:onModeArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Change OnMode Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nullable OnModeValue;

    CHIP_ERROR TestVerifyOnMode_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify OnMode Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("OnMode", actualValue));
                VerifyOrReturn(CheckValue("OnMode", actualValue, 7U));
            }
            {
                OnModeValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestToggleOnOff_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Toggle OnOff Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestToggleOnOff_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Toggle OnOff Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyCurrentModeChangesIfOnModeIsNotNull_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify Current Mode Changes if OnMode is not null Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentMode", actualValue, OnModeValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestChangeToUnsupportedStartUpMode_19()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id startUpModeArgument;
        startUpModeArgument = [NSNumber numberWithUnsignedChar:2U];
        [cluster writeAttributeStartUpModeWithValue:startUpModeArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Change to Unsupported StartUp Mode Error: %@", err);

                                             VerifyOrReturn(CheckValue("status",
                                                 err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                         ? err.code
                                                         : EMBER_ZCL_STATUS_FAILURE)
                                                     : 0,
                                                 EMBER_ZCL_STATUS_INVALID_COMMAND));
                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestChangeToSupportedStartUpMode_20()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id startUpModeArgument;
        startUpModeArgument = [NSNumber numberWithUnsignedChar:7U];
        [cluster writeAttributeStartUpModeWithValue:startUpModeArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Change to Supported StartUp Mode Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyStartUpModeChange_21()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeStartUpModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify StartUp Mode Change Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("StartUpMode", actualValue));
                VerifyOrReturn(CheckValue("StartUpMode", actualValue, 7U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestChangeCurrentModeToAnotherValue_22()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRModeSelectClusterChangeToModeParams alloc] init];
        params.newMode = [NSNumber numberWithUnsignedChar:0U];
        [cluster changeToModeWithParams:params
                             completion:^(NSError * _Nullable err) {
                                 NSLog(@"Change CurrentMode to another value Error: %@", err);

                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                 NextTest();
                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestChangeOnMode_23()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id onModeArgument;
        onModeArgument = [NSNumber numberWithUnsignedChar:4U];
        [cluster writeAttributeOnModeWithValue:onModeArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Change On Mode Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSetStartUpOnOff_24()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id startUpOnOffArgument;
        startUpOnOffArgument = [NSNumber numberWithUnsignedChar:1U];
        [cluster writeAttributeStartUpOnOffWithValue:startUpOnOffArgument
                                          completion:^(NSError * _Nullable err) {
                                              NSLog(@"Set StartUpOnOff Error: %@", err);

                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                              NextTest();
                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRebootTargetDevice_25()
    {

        chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
        return Reboot("alpha", value);
    }

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_26()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestVerifyCurrentModeChangeBasedOnOnModeAsItOverwritesStartUpMode_27()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify Current Mode Change based on OnMode, as it overwrites StartUpMode Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentMode", actualValue, 4U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestChangeOnModeToNull_28()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id onModeArgument;
        onModeArgument = nil;
        [cluster writeAttributeOnModeWithValue:onModeArgument
                                    completion:^(NSError * _Nullable err) {
                                        NSLog(@"Change On Mode to Null Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRebootTargetDevice_29()
    {

        chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
        return Reboot("alpha", value);
    }

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_30()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestVerifyCurrentModeChangeBasedOnNewStartUpMode_31()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify Current Mode Change based on new StartUp Mode Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentMode", actualValue, 7U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class TestSelfFabricRemoval : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestSelfFabricRemoval()
        : TestCommandBridge("TestSelfFabricRemoval")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestSelfFabricRemoval() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestSelfFabricRemoval\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestSelfFabricRemoval\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read number of commissioned fabrics\n");
            err = TestReadNumberOfCommissionedFabrics_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read current fabric index\n");
            err = TestReadCurrentFabricIndex_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Remove single own fabric\n");
            err = TestRemoveSingleOwnFabric_3();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 4;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadNumberOfCommissionedFabrics_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCommissionedFabricsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read number of commissioned fabrics Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CommissionedFabrics", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("commissionedFabrics", "int8u", "int8u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull ourFabricIndex;

    CHIP_ERROR TestReadCurrentFabricIndex_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentFabricIndexWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read current fabric index Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("currentFabricIndex", "int8u", "int8u"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("currentFabricIndex", [value unsignedCharValue], 1U));
            {
                ourFabricIndex = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRemoveSingleOwnFabric_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTROperationalCredentialsClusterRemoveFabricParams alloc] init];
        params.fabricIndex = [ourFabricIndex copy];
        [cluster removeFabricWithParams:params
                             completion:^(
                                 MTROperationalCredentialsClusterNOCResponseParams * _Nullable values, NSError * _Nullable err) {
                                 NSLog(@"Remove single own fabric Error: %@", err);

                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                 NextTest();
                             }];

        return CHIP_NO_ERROR;
    }
};

class TestSystemCommands : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestSystemCommands()
        : TestCommandBridge("TestSystemCommands")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("payload", &mPayload);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestSystemCommands() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestSystemCommands\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestSystemCommands\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Stop the default accessory\n");
            err = TestStopTheDefaultAccessory_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Start the default accessory with no command line options\n");
            err = TestStartTheDefaultAccessoryWithNoCommandLineOptions_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Stop the default accessory by key\n");
            err = TestStopTheDefaultAccessoryByKey_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Start the default accessory with discriminator command line option\n");
            err = TestStartTheDefaultAccessoryWithDiscriminatorCommandLineOption_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Stop the default accessory\n");
            err = TestStopTheDefaultAccessory_5();
            break;
        case 6:
            ChipLogProgress(
                chipTool, " ***** Test Step 6 : Start the default accessory with discriminator and port command line options\n");
            err = TestStartTheDefaultAccessoryWithDiscriminatorAndPortCommandLineOptions_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Stop the default accessory\n");
            err = TestStopTheDefaultAccessory_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Start the default accessory with minCommissioningTimeout only\n");
            err = TestStartTheDefaultAccessoryWithMinCommissioningTimeoutOnly_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Stop the default accessory\n");
            err = TestStopTheDefaultAccessory_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Start the default accessory by key with all command line options\n");
            err = TestStartTheDefaultAccessoryByKeyWithAllCommandLineOptions_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Start a second accessory with all command line options\n");
            err = TestStartASecondAccessoryWithAllCommandLineOptions_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Commission second accessory from alpha\n");
            err = TestCommissionSecondAccessoryFromAlpha_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Wait for the second commissioned device to be retrieved for alpha\n");
            err = TestWaitForTheSecondCommissionedDeviceToBeRetrievedForAlpha_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Stop the second accessory\n");
            err = TestStopTheSecondAccessory_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Start a second accessory with different KVS\n");
            err = TestStartASecondAccessoryWithDifferentKvs_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Reboot the default accessory\n");
            err = TestRebootTheDefaultAccessory_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Reboot the default accessory by key\n");
            err = TestRebootTheDefaultAccessoryByKey_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Reboot the second accessory\n");
            err = TestRebootTheSecondAccessory_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Factory Reset the default accessory\n");
            err = TestFactoryResetTheDefaultAccessory_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Factory Reset the default accessory by key\n");
            err = TestFactoryResetTheDefaultAccessoryByKey_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Factory Reset the second accessory\n");
            err = TestFactoryResetTheSecondAccessory_21();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 22;

    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_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestStopTheDefaultAccessory_1()
    {

        chip::app::Clusters::SystemCommands::Commands::Stop::Type value;
        return Stop("alpha", value);
    }

    CHIP_ERROR TestStartTheDefaultAccessoryWithNoCommandLineOptions_2()
    {

        chip::app::Clusters::SystemCommands::Commands::Start::Type value;
        return Start("alpha", value);
    }

    CHIP_ERROR TestStopTheDefaultAccessoryByKey_3()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestStartTheDefaultAccessoryWithDiscriminatorCommandLineOption_4()
    {

        chip::app::Clusters::SystemCommands::Commands::Start::Type value;
        value.discriminator.Emplace();
        value.discriminator.Value() = 1111U;
        return Start("alpha", value);
    }

    CHIP_ERROR TestStopTheDefaultAccessory_5()
    {

        chip::app::Clusters::SystemCommands::Commands::Stop::Type value;
        return Stop("alpha", value);
    }

    CHIP_ERROR TestStartTheDefaultAccessoryWithDiscriminatorAndPortCommandLineOptions_6()
    {

        chip::app::Clusters::SystemCommands::Commands::Start::Type value;
        value.discriminator.Emplace();
        value.discriminator.Value() = 1111U;
        value.port.Emplace();
        value.port.Value() = 5560U;
        return Start("alpha", value);
    }

    CHIP_ERROR TestStopTheDefaultAccessory_7()
    {

        chip::app::Clusters::SystemCommands::Commands::Stop::Type value;
        return Stop("alpha", value);
    }

    CHIP_ERROR TestStartTheDefaultAccessoryWithMinCommissioningTimeoutOnly_8()
    {

        chip::app::Clusters::SystemCommands::Commands::Start::Type value;
        value.minCommissioningTimeout.Emplace();
        value.minCommissioningTimeout.Value() = 10U;
        return Start("alpha", value);
    }

    CHIP_ERROR TestStopTheDefaultAccessory_9()
    {

        chip::app::Clusters::SystemCommands::Commands::Stop::Type value;
        return Stop("alpha", value);
    }

    CHIP_ERROR TestStartTheDefaultAccessoryByKeyWithAllCommandLineOptions_10()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestStartASecondAccessoryWithAllCommandLineOptions_11()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestCommissionSecondAccessoryFromAlpha_12()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestWaitForTheSecondCommissionedDeviceToBeRetrievedForAlpha_13()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = 3735928559ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestStopTheSecondAccessory_14()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestStartASecondAccessoryWithDifferentKvs_15()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestRebootTheDefaultAccessory_16()
    {

        chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
        return Reboot("alpha", value);
    }

    CHIP_ERROR TestRebootTheDefaultAccessoryByKey_17()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestRebootTheSecondAccessory_18()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestFactoryResetTheDefaultAccessory_19()
    {

        chip::app::Clusters::SystemCommands::Commands::FactoryReset::Type value;
        return FactoryReset("alpha", value);
    }

    CHIP_ERROR TestFactoryResetTheDefaultAccessoryByKey_20()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestFactoryResetTheSecondAccessory_21()
    {

        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("alpha", value);
    }
};

class TestBinding : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestBinding()
        : TestCommandBridge("TestBinding")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestBinding() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestBinding\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestBinding\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Write empty binding table\n");
            err = TestWriteEmptyBindingTable_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read empty binding table\n");
            err = TestReadEmptyBindingTable_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Write invalid binding table\n");
            err = TestWriteInvalidBindingTable_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Write binding table (endpoint 1)\n");
            err = TestWriteBindingTableEndpoint1_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read binding table (endpoint 1)\n");
            err = TestReadBindingTableEndpoint1_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Write binding table (endpoint 0)\n");
            err = TestWriteBindingTableEndpoint0_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read binding table (endpoint 0)\n");
            err = TestReadBindingTableEndpoint0_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Verify endpoint 1 not changed\n");
            err = TestVerifyEndpoint1NotChanged_8();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), 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));
            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));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 9;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestWriteEmptyBindingTable_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bindingArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            bindingArgument = temp_0;
        }
        [cluster writeAttributeBindingWithValue:bindingArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Write empty binding table Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadEmptyBindingTable_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRReadParams alloc] init];
        params.filterByFabric = true;
        [cluster readAttributeBindingWithParams:params
                                     completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                         NSLog(@"Read empty binding table Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         {
                                             id actualValue = value;
                                             VerifyOrReturn(CheckValue("Binding", [actualValue count], static_cast<uint32_t>(0)));
                                         }

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteInvalidBindingTable_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bindingArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRBindingClusterTargetStruct alloc] init];
            ((MTRBindingClusterTargetStruct *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:0U];

            temp_0[1] = [[MTRBindingClusterTargetStruct alloc] init];
            ((MTRBindingClusterTargetStruct *) temp_0[1]).node = [NSNumber numberWithUnsignedLongLong:1ULL];
            ((MTRBindingClusterTargetStruct *) temp_0[1]).group = [NSNumber numberWithUnsignedShort:1U];
            ((MTRBindingClusterTargetStruct *) temp_0[1]).endpoint = [NSNumber numberWithUnsignedShort:1U];
            ((MTRBindingClusterTargetStruct *) temp_0[1]).cluster = [NSNumber numberWithUnsignedInt:6UL];
            ((MTRBindingClusterTargetStruct *) temp_0[1]).fabricIndex = [NSNumber numberWithUnsignedChar:0U];

            bindingArgument = temp_0;
        }
        [cluster
            writeAttributeBindingWithValue:bindingArgument
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Write invalid binding table Error: %@", err);

                                    VerifyOrReturn(CheckValue("status",
                                        err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                      : EMBER_ZCL_STATUS_FAILURE)
                                            : 0,
                                        EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteBindingTableEndpoint1_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bindingArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRBindingClusterTargetStruct alloc] init];
            ((MTRBindingClusterTargetStruct *) temp_0[0]).group = [NSNumber numberWithUnsignedShort:1U];
            ((MTRBindingClusterTargetStruct *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:0U];

            temp_0[1] = [[MTRBindingClusterTargetStruct alloc] init];
            ((MTRBindingClusterTargetStruct *) temp_0[1]).node = [NSNumber numberWithUnsignedLongLong:1ULL];
            ((MTRBindingClusterTargetStruct *) temp_0[1]).endpoint = [NSNumber numberWithUnsignedShort:1U];
            ((MTRBindingClusterTargetStruct *) temp_0[1]).cluster = [NSNumber numberWithUnsignedInt:6UL];
            ((MTRBindingClusterTargetStruct *) temp_0[1]).fabricIndex = [NSNumber numberWithUnsignedChar:0U];

            temp_0[2] = [[MTRBindingClusterTargetStruct alloc] init];
            ((MTRBindingClusterTargetStruct *) temp_0[2]).node = [NSNumber numberWithUnsignedLongLong:2ULL];
            ((MTRBindingClusterTargetStruct *) temp_0[2]).endpoint = [NSNumber numberWithUnsignedShort:1U];
            ((MTRBindingClusterTargetStruct *) temp_0[2]).fabricIndex = [NSNumber numberWithUnsignedChar:0U];

            bindingArgument = temp_0;
        }
        [cluster writeAttributeBindingWithValue:bindingArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Write binding table (endpoint 1) Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBindingTableEndpoint1_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRReadParams alloc] init];
        params.filterByFabric = true;
        [cluster readAttributeBindingWithParams:params
                                     completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                         NSLog(@"Read binding table (endpoint 1) Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         {
                                             id actualValue = value;
                                             VerifyOrReturn(CheckValue("Binding", [actualValue count], static_cast<uint32_t>(3)));
                                             VerifyOrReturn(
                                                 CheckValue("Group", ((MTRBindingClusterTargetStruct *) actualValue[0]).group, 1U));
                                             VerifyOrReturn(CheckValue("FabricIndex",
                                                 ((MTRBindingClusterTargetStruct *) actualValue[0]).fabricIndex, 1U));
                                             VerifyOrReturn(
                                                 CheckValue("Node", ((MTRBindingClusterTargetStruct *) actualValue[1]).node, 1ULL));
                                             VerifyOrReturn(CheckValue(
                                                 "Endpoint", ((MTRBindingClusterTargetStruct *) actualValue[1]).endpoint, 1U));
                                             VerifyOrReturn(CheckValue(
                                                 "Cluster", ((MTRBindingClusterTargetStruct *) actualValue[1]).cluster, 6UL));
                                             VerifyOrReturn(CheckValue("FabricIndex",
                                                 ((MTRBindingClusterTargetStruct *) actualValue[1]).fabricIndex, 1U));
                                             VerifyOrReturn(
                                                 CheckValue("Node", ((MTRBindingClusterTargetStruct *) actualValue[2]).node, 2ULL));
                                             VerifyOrReturn(CheckValue(
                                                 "Endpoint", ((MTRBindingClusterTargetStruct *) actualValue[2]).endpoint, 1U));
                                             VerifyOrReturn(CheckValue("FabricIndex",
                                                 ((MTRBindingClusterTargetStruct *) actualValue[2]).fabricIndex, 1U));
                                         }

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteBindingTableEndpoint0_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bindingArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRBindingClusterTargetStruct alloc] init];
            ((MTRBindingClusterTargetStruct *) temp_0[0]).node = [NSNumber numberWithUnsignedLongLong:3ULL];
            ((MTRBindingClusterTargetStruct *) temp_0[0]).endpoint = [NSNumber numberWithUnsignedShort:1U];
            ((MTRBindingClusterTargetStruct *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:0U];

            bindingArgument = temp_0;
        }
        [cluster writeAttributeBindingWithValue:bindingArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Write binding table (endpoint 0) Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBindingTableEndpoint0_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRReadParams alloc] init];
        params.filterByFabric = true;
        [cluster readAttributeBindingWithParams:params
                                     completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                         NSLog(@"Read binding table (endpoint 0) Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         {
                                             id actualValue = value;
                                             VerifyOrReturn(CheckValue("Binding", [actualValue count], static_cast<uint32_t>(1)));
                                             VerifyOrReturn(
                                                 CheckValue("Node", ((MTRBindingClusterTargetStruct *) actualValue[0]).node, 3ULL));
                                             VerifyOrReturn(CheckValue(
                                                 "Endpoint", ((MTRBindingClusterTargetStruct *) actualValue[0]).endpoint, 1U));
                                             VerifyOrReturn(CheckValue("FabricIndex",
                                                 ((MTRBindingClusterTargetStruct *) actualValue[0]).fabricIndex, 1U));
                                         }

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyEndpoint1NotChanged_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRReadParams alloc] init];
        params.filterByFabric = true;
        [cluster readAttributeBindingWithParams:params
                                     completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                         NSLog(@"Verify endpoint 1 not changed Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         {
                                             id actualValue = value;
                                             VerifyOrReturn(CheckValue("Binding", [actualValue count], static_cast<uint32_t>(3)));
                                             VerifyOrReturn(
                                                 CheckValue("Group", ((MTRBindingClusterTargetStruct *) actualValue[0]).group, 1U));
                                             VerifyOrReturn(CheckValue("FabricIndex",
                                                 ((MTRBindingClusterTargetStruct *) actualValue[0]).fabricIndex, 1U));
                                             VerifyOrReturn(
                                                 CheckValue("Node", ((MTRBindingClusterTargetStruct *) actualValue[1]).node, 1ULL));
                                             VerifyOrReturn(CheckValue(
                                                 "Endpoint", ((MTRBindingClusterTargetStruct *) actualValue[1]).endpoint, 1U));
                                             VerifyOrReturn(CheckValue(
                                                 "Cluster", ((MTRBindingClusterTargetStruct *) actualValue[1]).cluster, 6UL));
                                             VerifyOrReturn(CheckValue("FabricIndex",
                                                 ((MTRBindingClusterTargetStruct *) actualValue[1]).fabricIndex, 1U));
                                             VerifyOrReturn(
                                                 CheckValue("Node", ((MTRBindingClusterTargetStruct *) actualValue[2]).node, 2ULL));
                                             VerifyOrReturn(CheckValue(
                                                 "Endpoint", ((MTRBindingClusterTargetStruct *) actualValue[2]).endpoint, 1U));
                                             VerifyOrReturn(CheckValue("FabricIndex",
                                                 ((MTRBindingClusterTargetStruct *) actualValue[2]).fabricIndex, 1U));
                                         }

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }
};

class TestUserLabelCluster : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestUserLabelCluster()
        : TestCommandBridge("TestUserLabelCluster")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestUserLabelCluster() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestUserLabelCluster\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestUserLabelCluster\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Commit User Label List\n");
            err = TestCommitUserLabelList_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Verify committed User Label List\n");
            err = TestVerifyCommittedUserLabelList_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Clear User Label List\n");
            err = TestClearUserLabelList_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read User Label List\n");
            err = TestReadUserLabelList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Write User Label List\n");
            err = TestWriteUserLabelList_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Reboot target device\n");
            err = TestRebootTargetDevice_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Verify User Label List after reboot\n");
            err = TestVerifyUserLabelListAfterReboot_8();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 9;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestCommitUserLabelList_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id labelListArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRUserLabelClusterLabelStruct alloc] init];
            ((MTRUserLabelClusterLabelStruct *) temp_0[0]).label = @"room";
            ((MTRUserLabelClusterLabelStruct *) temp_0[0]).value = @"bedroom 1";

            temp_0[1] = [[MTRUserLabelClusterLabelStruct alloc] init];
            ((MTRUserLabelClusterLabelStruct *) temp_0[1]).label = @"orientation";
            ((MTRUserLabelClusterLabelStruct *) temp_0[1]).value = @"South";

            temp_0[2] = [[MTRUserLabelClusterLabelStruct alloc] init];
            ((MTRUserLabelClusterLabelStruct *) temp_0[2]).label = @"floor";
            ((MTRUserLabelClusterLabelStruct *) temp_0[2]).value = @"2";

            temp_0[3] = [[MTRUserLabelClusterLabelStruct alloc] init];
            ((MTRUserLabelClusterLabelStruct *) temp_0[3]).label = @"direction";
            ((MTRUserLabelClusterLabelStruct *) temp_0[3]).value = @"down";

            labelListArgument = temp_0;
        }
        [cluster writeAttributeLabelListWithValue:labelListArgument
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(@"Commit User Label List Error: %@", err);

                                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyCommittedUserLabelList_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLabelListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify committed User Label List Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("LabelList", [actualValue count], static_cast<uint32_t>(4)));
                VerifyOrReturn(CheckValueAsString("Label", ((MTRUserLabelClusterLabelStruct *) actualValue[0]).label, @"room"));
                VerifyOrReturn(
                    CheckValueAsString("Value", ((MTRUserLabelClusterLabelStruct *) actualValue[0]).value, @"bedroom 1"));
                VerifyOrReturn(
                    CheckValueAsString("Label", ((MTRUserLabelClusterLabelStruct *) actualValue[1]).label, @"orientation"));
                VerifyOrReturn(CheckValueAsString("Value", ((MTRUserLabelClusterLabelStruct *) actualValue[1]).value, @"South"));
                VerifyOrReturn(CheckValueAsString("Label", ((MTRUserLabelClusterLabelStruct *) actualValue[2]).label, @"floor"));
                VerifyOrReturn(CheckValueAsString("Value", ((MTRUserLabelClusterLabelStruct *) actualValue[2]).value, @"2"));
                VerifyOrReturn(
                    CheckValueAsString("Label", ((MTRUserLabelClusterLabelStruct *) actualValue[3]).label, @"direction"));
                VerifyOrReturn(CheckValueAsString("Value", ((MTRUserLabelClusterLabelStruct *) actualValue[3]).value, @"down"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearUserLabelList_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id labelListArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            labelListArgument = temp_0;
        }
        [cluster writeAttributeLabelListWithValue:labelListArgument
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(@"Clear User Label List Error: %@", err);

                                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadUserLabelList_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLabelListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read User Label List Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("LabelList", [actualValue count], static_cast<uint32_t>(0)));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteUserLabelList_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id labelListArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRUserLabelClusterLabelStruct alloc] init];
            ((MTRUserLabelClusterLabelStruct *) temp_0[0]).label = @"room";
            ((MTRUserLabelClusterLabelStruct *) temp_0[0]).value = @"bedroom 2";

            temp_0[1] = [[MTRUserLabelClusterLabelStruct alloc] init];
            ((MTRUserLabelClusterLabelStruct *) temp_0[1]).label = @"orientation";
            ((MTRUserLabelClusterLabelStruct *) temp_0[1]).value = @"North";

            temp_0[2] = [[MTRUserLabelClusterLabelStruct alloc] init];
            ((MTRUserLabelClusterLabelStruct *) temp_0[2]).label = @"floor";
            ((MTRUserLabelClusterLabelStruct *) temp_0[2]).value = @"5";

            temp_0[3] = [[MTRUserLabelClusterLabelStruct alloc] init];
            ((MTRUserLabelClusterLabelStruct *) temp_0[3]).label = @"direction";
            ((MTRUserLabelClusterLabelStruct *) temp_0[3]).value = @"up";

            labelListArgument = temp_0;
        }
        [cluster writeAttributeLabelListWithValue:labelListArgument
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(@"Write User Label List Error: %@", err);

                                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRebootTargetDevice_6()
    {

        chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
        return Reboot("alpha", value);
    }

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_7()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestVerifyUserLabelListAfterReboot_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLabelListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify User Label List after reboot Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("LabelList", [actualValue count], static_cast<uint32_t>(4)));
                VerifyOrReturn(CheckValueAsString("Label", ((MTRUserLabelClusterLabelStruct *) actualValue[0]).label, @"room"));
                VerifyOrReturn(
                    CheckValueAsString("Value", ((MTRUserLabelClusterLabelStruct *) actualValue[0]).value, @"bedroom 2"));
                VerifyOrReturn(
                    CheckValueAsString("Label", ((MTRUserLabelClusterLabelStruct *) actualValue[1]).label, @"orientation"));
                VerifyOrReturn(CheckValueAsString("Value", ((MTRUserLabelClusterLabelStruct *) actualValue[1]).value, @"North"));
                VerifyOrReturn(CheckValueAsString("Label", ((MTRUserLabelClusterLabelStruct *) actualValue[2]).label, @"floor"));
                VerifyOrReturn(CheckValueAsString("Value", ((MTRUserLabelClusterLabelStruct *) actualValue[2]).value, @"5"));
                VerifyOrReturn(
                    CheckValueAsString("Label", ((MTRUserLabelClusterLabelStruct *) actualValue[3]).label, @"direction"));
                VerifyOrReturn(CheckValueAsString("Value", ((MTRUserLabelClusterLabelStruct *) actualValue[3]).value, @"up"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class TestUserLabelClusterConstraints : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestUserLabelClusterConstraints()
        : TestCommandBridge("TestUserLabelClusterConstraints")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestUserLabelClusterConstraints() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestUserLabelClusterConstraints\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestUserLabelClusterConstraints\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Attempt to write overly long item for label\n");
            err = TestAttemptToWriteOverlyLongItemForLabel_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Attempt to write overly long item for value\n");
            err = TestAttemptToWriteOverlyLongItemForValue_2();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 3;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestAttemptToWriteOverlyLongItemForLabel_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id labelListArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRUserLabelClusterLabelStruct alloc] init];
            ((MTRUserLabelClusterLabelStruct *) temp_0[0]).label = @"this is longer than sixteen characters";
            ((MTRUserLabelClusterLabelStruct *) temp_0[0]).value = @"bedroom 2";

            labelListArgument = temp_0;
        }
        [cluster
            writeAttributeLabelListWithValue:labelListArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"Attempt to write overly long item for label Error: %@", err);

                                      VerifyOrReturn(CheckValue("status",
                                          err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                        : EMBER_ZCL_STATUS_FAILURE)
                                              : 0,
                                          EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestAttemptToWriteOverlyLongItemForValue_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id labelListArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRUserLabelClusterLabelStruct alloc] init];
            ((MTRUserLabelClusterLabelStruct *) temp_0[0]).label = @"test";
            ((MTRUserLabelClusterLabelStruct *) temp_0[0]).value = @"this is longer than sixteen characters";

            labelListArgument = temp_0;
        }
        [cluster
            writeAttributeLabelListWithValue:labelListArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"Attempt to write overly long item for value Error: %@", err);

                                      VerifyOrReturn(CheckValue("status",
                                          err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                        : EMBER_ZCL_STATUS_FAILURE)
                                              : 0,
                                          EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }
};

class TestArmFailSafe : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestArmFailSafe()
        : TestCommandBridge("TestArmFailSafe")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestArmFailSafe() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestArmFailSafe\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestArmFailSafe\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Reboot target device\n");
            err = TestRebootTargetDevice_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Wait for the alpha device to be retrieved \n");
            err = TestWaitForTheAlphaDeviceToBeRetrieved_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Query fabrics list\n");
            err = TestQueryFabricsList_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : ArmFailSafe on target device with timeout 0\n");
            err = TestArmFailSafeOnTargetDeviceWithTimeout0_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Reads NodeLabel mandatory attribute of target device\n");
            err = TestReadsNodeLabelMandatoryAttributeOfTargetDevice_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Invoke AddTrustedRootCertificate without fail-safe\n");
            err = TestInvokeAddTrustedRootCertificateWithoutFailSafe_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Invoke AddNOC without fail-safe\n");
            err = TestInvokeAddNOCWithoutFailSafe_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Invoke UpdateNOC without fail-safe\n");
            err = TestInvokeUpdateNOCWithoutFailSafe_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Invoke CSRRequest without fail-safe\n");
            err = TestInvokeCSRRequestWithoutFailSafe_8();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 9;

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

    CHIP_ERROR TestRebootTargetDevice_0()
    {

        chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
        return Reboot("alpha", value);
    }

    CHIP_ERROR TestWaitForTheAlphaDeviceToBeRetrieved_1()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestQueryFabricsList_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRReadParams alloc] init];
        params.filterByFabric = true;
        [cluster readAttributeFabricsWithParams:params
                                     completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                         NSLog(@"Query fabrics list Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         {
                                             id actualValue = value;
                                             VerifyOrReturn(CheckValue("Fabrics", [actualValue count], static_cast<uint32_t>(1)));
                                             VerifyOrReturn(CheckValue("NodeID",
                                                 ((MTROperationalCredentialsClusterFabricDescriptorStruct *) actualValue[0]).nodeID,
                                                 mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL));
                                             VerifyOrReturn(CheckValueAsString("Label",
                                                 ((MTROperationalCredentialsClusterFabricDescriptorStruct *) actualValue[0]).label,
                                                 @""));
                                         }

                                         VerifyOrReturn(CheckConstraintType("fabrics", "list", "list"));
                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestArmFailSafeOnTargetDeviceWithTimeout0_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                endpointID:@(0)
                                                                                     queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGeneralCommissioningClusterArmFailSafeParams alloc] init];
        params.expiryLengthSeconds = [NSNumber numberWithUnsignedShort:0U];
        params.breadcrumb = [NSNumber numberWithUnsignedLongLong:0ULL];
        [cluster armFailSafeWithParams:params
                            completion:^(MTRGeneralCommissioningClusterArmFailSafeResponseParams * _Nullable values,
                                NSError * _Nullable err) {
                                NSLog(@"ArmFailSafe on target device with timeout 0 Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                {
                                    id actualValue = values.errorCode;
                                    VerifyOrReturn(CheckValue("ErrorCode", actualValue, 0U));
                                }

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsNodeLabelMandatoryAttributeOfTargetDevice_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBasicInformation alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNodeLabelWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads NodeLabel mandatory attribute of target device Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("NodeLabel", actualValue, @""));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestInvokeAddTrustedRootCertificateWithoutFailSafe_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTROperationalCredentialsClusterAddTrustedRootCertificateParams alloc] init];
        params.rootCACertificate = [[NSData alloc] initWithBytes:"00000000" length:8];
        [cluster addTrustedRootCertificateWithParams:params
                                          completion:^(NSError * _Nullable err) {
                                              NSLog(@"Invoke AddTrustedRootCertificate without fail-safe Error: %@", err);

                                              VerifyOrReturn(CheckValue("status",
                                                  err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                          ? err.code
                                                          : EMBER_ZCL_STATUS_FAILURE)
                                                      : 0,
                                                  EMBER_ZCL_STATUS_FAILSAFE_REQUIRED));
                                              NextTest();
                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestInvokeAddNOCWithoutFailSafe_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTROperationalCredentialsClusterAddNOCParams alloc] init];
        params.nocValue = [[NSData alloc] initWithBytes:"00112233" length:8];
        params.ipkValue = [[NSData alloc] initWithBytes:"\000\001\002\003\004\005\006\007\000\001\002\003\004\005\006\007"
                                                 length:16];
        params.caseAdminSubject = [NSNumber numberWithUnsignedLongLong:1234ULL];
        params.adminVendorId = [NSNumber numberWithUnsignedShort:65521U];
        [cluster
            addNOCWithParams:params
                  completion:^(MTROperationalCredentialsClusterNOCResponseParams * _Nullable values, NSError * _Nullable err) {
                      NSLog(@"Invoke AddNOC without fail-safe Error: %@", err);

                      VerifyOrReturn(CheckValue("status",
                          err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE) : 0,
                          EMBER_ZCL_STATUS_FAILSAFE_REQUIRED));
                      NextTest();
                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestInvokeUpdateNOCWithoutFailSafe_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTROperationalCredentialsClusterUpdateNOCParams alloc] init];
        params.nocValue = [[NSData alloc] initWithBytes:"00112233" length:8];
        [cluster
            updateNOCWithParams:params
                     completion:^(MTROperationalCredentialsClusterNOCResponseParams * _Nullable values, NSError * _Nullable err) {
                         NSLog(@"Invoke UpdateNOC without fail-safe Error: %@", err);

                         VerifyOrReturn(CheckValue("status",
                             err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                 : 0,
                             EMBER_ZCL_STATUS_FAILSAFE_REQUIRED));
                         NextTest();
                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestInvokeCSRRequestWithoutFailSafe_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTROperationalCredentialsClusterCSRRequestParams alloc] init];
        params.csrNonce = [[NSData alloc] initWithBytes:"\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\007"
                                                 length:32];
        [cluster
            CSRRequestWithParams:params
                      completion:^(MTROperationalCredentialsClusterCSRResponseParams * _Nullable values, NSError * _Nullable err) {
                          NSLog(@"Invoke CSRRequest without fail-safe Error: %@", err);

                          VerifyOrReturn(CheckValue("status",
                              err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                  : 0,
                              EMBER_ZCL_STATUS_FAILSAFE_REQUIRED));
                          NextTest();
                      }];

        return CHIP_NO_ERROR;
    }
};

class TestFanControl : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestFanControl()
        : TestCommandBridge("TestFanControl")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestFanControl() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestFanControl\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestFanControl\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Write fan mode\n");
            err = TestWriteFanMode_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read back fan mode\n");
            err = TestReadBackFanMode_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Write fan mode sequence\n");
            err = TestWriteFanModeSequence_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read back fan mode sequence\n");
            err = TestReadBackFanModeSequence_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Write percent setting\n");
            err = TestWritePercentSetting_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read back percent setting\n");
            err = TestReadBackPercentSetting_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read back speed setting\n");
            err = TestReadBackSpeedSetting_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read back speed current\n");
            err = TestReadBackSpeedCurrent_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Write percent setting\n");
            err = TestWritePercentSetting_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Read back percent setting\n");
            err = TestReadBackPercentSetting_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Write speed setting\n");
            err = TestWriteSpeedSetting_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Read back speed setting\n");
            err = TestReadBackSpeedSetting_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Read back percent setting\n");
            err = TestReadBackPercentSetting_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Read back percent current\n");
            err = TestReadBackPercentCurrent_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Write speed setting\n");
            err = TestWriteSpeedSetting_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Read back speed setting\n");
            err = TestReadBackSpeedSetting_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Write fan mode\n");
            err = TestWriteFanMode_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Read back percent setting\n");
            err = TestReadBackPercentSetting_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Read back percent current\n");
            err = TestReadBackPercentCurrent_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Read back speed setting\n");
            err = TestReadBackSpeedSetting_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Read back speed current\n");
            err = TestReadBackSpeedCurrent_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : Write fan mode\n");
            err = TestWriteFanMode_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : Read back percent setting\n");
            err = TestReadBackPercentSetting_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : Read back speed setting\n");
            err = TestReadBackSpeedSetting_24();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 25;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestWriteFanMode_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id fanModeArgument;
        fanModeArgument = [NSNumber numberWithUnsignedChar:3U];
        [cluster writeAttributeFanModeWithValue:fanModeArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Write fan mode Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackFanMode_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFanModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back fan mode Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FanMode", actualValue, 3U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteFanModeSequence_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id fanModeSequenceArgument;
        fanModeSequenceArgument = [NSNumber numberWithUnsignedChar:5U];
        [cluster writeAttributeFanModeSequenceWithValue:fanModeSequenceArgument
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"Write fan mode sequence Error: %@", err);

                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackFanModeSequence_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFanModeSequenceWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back fan mode sequence Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FanModeSequence", actualValue, 5U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritePercentSetting_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id percentSettingArgument;
        percentSettingArgument = [NSNumber numberWithUnsignedChar:84U];
        [cluster writeAttributePercentSettingWithValue:percentSettingArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write percent setting Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackPercentSetting_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePercentSettingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back percent setting Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("PercentSetting", actualValue));
                VerifyOrReturn(CheckValue("PercentSetting", actualValue, 84U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackSpeedSetting_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSpeedSettingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back speed setting Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("SpeedSetting", actualValue));
                VerifyOrReturn(CheckValue("SpeedSetting", actualValue, 84U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackSpeedCurrent_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSpeedCurrentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back speed current Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("SpeedCurrent", actualValue, 84U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritePercentSetting_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id percentSettingArgument;
        percentSettingArgument = nil;
        [cluster writeAttributePercentSettingWithValue:percentSettingArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(@"Write percent setting Error: %@", err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackPercentSetting_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePercentSettingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back percent setting Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("PercentSetting", actualValue));
                VerifyOrReturn(CheckValue("PercentSetting", actualValue, 84U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteSpeedSetting_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id speedSettingArgument;
        speedSettingArgument = [NSNumber numberWithUnsignedChar:73U];
        [cluster writeAttributeSpeedSettingWithValue:speedSettingArgument
                                          completion:^(NSError * _Nullable err) {
                                              NSLog(@"Write speed setting Error: %@", err);

                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                              NextTest();
                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackSpeedSetting_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSpeedSettingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back speed setting Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("SpeedSetting", actualValue));
                VerifyOrReturn(CheckValue("SpeedSetting", actualValue, 73U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackPercentSetting_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePercentSettingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back percent setting Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("PercentSetting", actualValue));
                VerifyOrReturn(CheckValue("PercentSetting", actualValue, 73U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackPercentCurrent_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePercentCurrentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back percent current Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("PercentCurrent", actualValue, 73U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteSpeedSetting_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id speedSettingArgument;
        speedSettingArgument = nil;
        [cluster writeAttributeSpeedSettingWithValue:speedSettingArgument
                                          completion:^(NSError * _Nullable err) {
                                              NSLog(@"Write speed setting Error: %@", err);

                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                              NextTest();
                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackSpeedSetting_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSpeedSettingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back speed setting Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("SpeedSetting", actualValue));
                VerifyOrReturn(CheckValue("SpeedSetting", actualValue, 73U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteFanMode_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id fanModeArgument;
        fanModeArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeFanModeWithValue:fanModeArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Write fan mode Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackPercentSetting_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePercentSettingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back percent setting Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("PercentSetting", actualValue));
                VerifyOrReturn(CheckValue("PercentSetting", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackPercentCurrent_19()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePercentCurrentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back percent current Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("PercentCurrent", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackSpeedSetting_20()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSpeedSettingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back speed setting Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("SpeedSetting", actualValue));
                VerifyOrReturn(CheckValue("SpeedSetting", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackSpeedCurrent_21()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSpeedCurrentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back speed current Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("SpeedCurrent", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteFanMode_22()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id fanModeArgument;
        fanModeArgument = [NSNumber numberWithUnsignedChar:5U];
        [cluster writeAttributeFanModeWithValue:fanModeArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Write fan mode Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackPercentSetting_23()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePercentSettingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back percent setting Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("PercentSetting", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackSpeedSetting_24()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSpeedSettingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read back speed setting Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("SpeedSetting", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class TestAccessControlConstraints : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestAccessControlConstraints()
        : TestCommandBridge("TestAccessControlConstraints")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestAccessControlConstraints() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestAccessControlConstraints\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestAccessControlConstraints\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Constraint error: PASE reserved for future (TC-ACL-2.4 step 29)\n");
            err = TestConstraintErrorPaseReservedForFutureTcAcl24Step29_1();
            break;
        case 2:
            ChipLogProgress(
                chipTool, " ***** Test Step 2 : Constraint error: Invalid combination administer + group (TC-ACL-2.4 step 31)\n");
            err = TestConstraintErrorInvalidCombinationAdministerGroupTcAcl24Step31_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Constraint error:  Invalid auth mode (TC-ACL-2.4 step 33)\n");
            err = TestConstraintErrorInvalidAuthModeTcAcl24Step33_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Constraint error:  Invalid subject (TC-ACL-2.4 step 34)\n");
            err = TestConstraintErrorInvalidSubjectTcAcl24Step34_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Constraint error:  Invalid target (TC-ACL-2.4 step 38)\n");
            err = TestConstraintErrorInvalidTargetTcAcl24Step38_5();
            break;
        case 6:
            ChipLogProgress(chipTool,
                " ***** Test Step 6 : Constraint error:  target has both endpoint and device type (TC-ACL-2.4 step 42)\n");
            err = TestConstraintErrorTargetHasBothEndpointAndDeviceTypeTcAcl24Step42_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Constraint error: Invalid privilege value step 32)\n");
            err = TestConstraintErrorInvalidPrivilegeValueStep32_7();
            break;
        case 8:
            ChipLogProgress(
                chipTool, " ***** Test Step 8 : Constraint error: invalid subject 0xFFFF_FFFF_FFFF_FFFF (TC-ACL-2.4 step 35)\n");
            err = TestConstraintErrorInvalidSubject0xFFFFFfffFfffFfffTcAcl24Step35_8();
            break;
        case 9:
            ChipLogProgress(
                chipTool, " ***** Test Step 9 : Constraint error: invalid subject 0xFFFF_FFFD_0000_0000 (TC-ACL-2.4 step 36)\n");
            err = TestConstraintErrorInvalidSubject0xFFFFFffd00000000TcAcl24Step36_9();
            break;
        case 10:
            ChipLogProgress(
                chipTool, " ***** Test Step 10 : Constraint error: invalid subject 0xFFFF_FFFF_FFFF_0000 (TC-ACL-2.4 step 37)\n");
            err = TestConstraintErrorInvalidSubject0xFFFFFfffFfff0000TcAcl24Step37_10();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 11;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestConstraintErrorPaseReservedForFutureTcAcl24Step29_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id aclArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:112233ULL];
                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:3U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:1U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            aclArgument = temp_0;
        }
        [cluster writeAttributeACLWithValue:aclArgument
                                 completion:^(NSError * _Nullable err) {
                                     NSLog(@"Constraint error: PASE reserved for future (TC-ACL-2.4 step 29) Error: %@", err);

                                     VerifyOrReturn(CheckValue("status",
                                         err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                       : EMBER_ZCL_STATUS_FAILURE)
                                             : 0,
                                         EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestConstraintErrorInvalidCombinationAdministerGroupTcAcl24Step31_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id aclArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:112233ULL];
                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:3U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            aclArgument = temp_0;
        }
        [cluster
            writeAttributeACLWithValue:aclArgument
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"Constraint error: Invalid combination administer + group (TC-ACL-2.4 step 31) Error: %@",
                                    err);

                                VerifyOrReturn(CheckValue("status",
                                    err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                  : EMBER_ZCL_STATUS_FAILURE)
                                        : 0,
                                    EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestConstraintErrorInvalidAuthModeTcAcl24Step33_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id aclArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:112233ULL];
                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:3U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:4U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            aclArgument = temp_0;
        }
        [cluster writeAttributeACLWithValue:aclArgument
                                 completion:^(NSError * _Nullable err) {
                                     NSLog(@"Constraint error:  Invalid auth mode (TC-ACL-2.4 step 33) Error: %@", err);

                                     VerifyOrReturn(CheckValue("status",
                                         err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                       : EMBER_ZCL_STATUS_FAILURE)
                                             : 0,
                                         EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestConstraintErrorInvalidSubjectTcAcl24Step34_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id aclArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:112233ULL];
                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:3U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:0ULL];
                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            aclArgument = temp_0;
        }
        [cluster writeAttributeACLWithValue:aclArgument
                                 completion:^(NSError * _Nullable err) {
                                     NSLog(@"Constraint error:  Invalid subject (TC-ACL-2.4 step 34) Error: %@", err);

                                     VerifyOrReturn(CheckValue("status",
                                         err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                       : EMBER_ZCL_STATUS_FAILURE)
                                             : 0,
                                         EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestConstraintErrorInvalidTargetTcAcl24Step38_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id aclArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:112233ULL];
                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:3U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:2U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).subjects = nil;
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[0]).cluster = nil;
                ((MTRAccessControlClusterTarget *) temp_3[0]).endpoint = nil;
                ((MTRAccessControlClusterTarget *) temp_3[0]).deviceType = nil;

                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).targets = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            aclArgument = temp_0;
        }
        [cluster writeAttributeACLWithValue:aclArgument
                                 completion:^(NSError * _Nullable err) {
                                     NSLog(@"Constraint error:  Invalid target (TC-ACL-2.4 step 38) Error: %@", err);

                                     VerifyOrReturn(CheckValue("status",
                                         err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                       : EMBER_ZCL_STATUS_FAILURE)
                                             : 0,
                                         EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestConstraintErrorTargetHasBothEndpointAndDeviceTypeTcAcl24Step42_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id aclArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:112233ULL];
                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:3U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:2U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).subjects = nil;
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [[MTRAccessControlClusterTarget alloc] init];
                ((MTRAccessControlClusterTarget *) temp_3[0]).cluster = nil;
                ((MTRAccessControlClusterTarget *) temp_3[0]).endpoint = [NSNumber numberWithUnsignedShort:22U];
                ((MTRAccessControlClusterTarget *) temp_3[0]).deviceType = [NSNumber numberWithUnsignedInt:33UL];

                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).targets = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            aclArgument = temp_0;
        }
        [cluster
            writeAttributeACLWithValue:aclArgument
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"Constraint error:  target has both endpoint and device type (TC-ACL-2.4 step 42) Error: %@",
                                    err);

                                VerifyOrReturn(CheckValue("status",
                                    err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                  : EMBER_ZCL_STATUS_FAILURE)
                                        : 0,
                                    EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestConstraintErrorInvalidPrivilegeValueStep32_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id aclArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:112233ULL];
                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:6U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:2U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).subjects = nil;
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            aclArgument = temp_0;
        }
        [cluster writeAttributeACLWithValue:aclArgument
                                 completion:^(NSError * _Nullable err) {
                                     NSLog(@"Constraint error: Invalid privilege value step 32) Error: %@", err);

                                     VerifyOrReturn(CheckValue("status",
                                         err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                       : EMBER_ZCL_STATUS_FAILURE)
                                             : 0,
                                         EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestConstraintErrorInvalidSubject0xFFFFFfffFfffFfffTcAcl24Step35_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id aclArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:112233ULL];
                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:3U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:18446744073709551615ULL];
                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            aclArgument = temp_0;
        }
        [cluster
            writeAttributeACLWithValue:aclArgument
                            completion:^(NSError * _Nullable err) {
                                NSLog(
                                    @"Constraint error: invalid subject 0xFFFF_FFFF_FFFF_FFFF (TC-ACL-2.4 step 35) Error: %@", err);

                                VerifyOrReturn(CheckValue("status",
                                    err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                  : EMBER_ZCL_STATUS_FAILURE)
                                        : 0,
                                    EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestConstraintErrorInvalidSubject0xFFFFFffd00000000TcAcl24Step36_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id aclArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:112233ULL];
                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:3U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:18446744060824649728ULL];
                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            aclArgument = temp_0;
        }
        [cluster
            writeAttributeACLWithValue:aclArgument
                            completion:^(NSError * _Nullable err) {
                                NSLog(
                                    @"Constraint error: invalid subject 0xFFFF_FFFD_0000_0000 (TC-ACL-2.4 step 36) Error: %@", err);

                                VerifyOrReturn(CheckValue("status",
                                    err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                  : EMBER_ZCL_STATUS_FAILURE)
                                        : 0,
                                    EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestConstraintErrorInvalidSubject0xFFFFFfffFfff0000TcAcl24Step37_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id aclArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:112233ULL];
                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:3U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:18446744073709486080ULL];
                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[1]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            aclArgument = temp_0;
        }
        [cluster
            writeAttributeACLWithValue:aclArgument
                            completion:^(NSError * _Nullable err) {
                                NSLog(
                                    @"Constraint error: invalid subject 0xFFFF_FFFF_FFFF_0000 (TC-ACL-2.4 step 37) Error: %@", err);

                                VerifyOrReturn(CheckValue("status",
                                    err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                  : EMBER_ZCL_STATUS_FAILURE)
                                        : 0,
                                    EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }
};

class TestLevelControlWithOnOffDependency : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestLevelControlWithOnOffDependency()
        : TestCommandBridge("TestLevelControlWithOnOffDependency")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestLevelControlWithOnOffDependency() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestLevelControlWithOnOffDependency\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestLevelControlWithOnOffDependency\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Sends a MoveToLevel command to set CurrentLevel to min value\n");
            err = TestSendsAMoveToLevelCommandToSetCurrentLevelToMinValue_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Wait 100 ms\n");
            err = TestWait100Ms_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Reads CurrentLevel attribute from DUT\n");
            err = TestReadsCurrentLevelAttributeFromDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Write OnOffTransitionTime attribute\n");
            err = TestWriteOnOffTransitionTimeAttribute_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Wait 100 ms\n");
            err = TestWait100Ms_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read OnOffTransitionTime attribute\n");
            err = TestReadOnOffTransitionTimeAttribute_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Write OnLevel attribute\n");
            err = TestWriteOnLevelAttribute_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Wait 100 ms\n");
            err = TestWait100Ms_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Read OnLevel attribute\n");
            err = TestReadOnLevelAttribute_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Read MinValue attribute\n");
            err = TestReadMinValueAttribute_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Send On Command\n");
            err = TestSendOnCommand_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Check on/off attribute value is true after on command\n");
            err = TestCheckOnOffAttributeValueIsTrueAfterOnCommand_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Wait OnOffTransitionTime\n");
            err = TestWaitOnOffTransitionTime_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : If OnLevel is defined, check CurrentLevel is OnLevel value\n");
            err = TestIfOnLevelIsDefinedCheckCurrentLevelIsOnLevelValue_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Send Off Command\n");
            err = TestSendOffCommand_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Check on/off attribute value is false after off command\n");
            err = TestCheckOnOffAttributeValueIsFalseAfterOffCommand_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Wait OnOffTransitionTime\n");
            err = TestWaitOnOffTransitionTime_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : If OnLevel is defined, check CurrentLevel is min value\n");
            err = TestIfOnLevelIsDefinedCheckCurrentLevelIsMinValue_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Sends a MoveToLevel command to set CurrentLevel to a mid value\n");
            err = TestSendsAMoveToLevelCommandToSetCurrentLevelToAMidValue_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Wait 100 ms\n");
            err = TestWait100Ms_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Reads CurrentLevel attribute from DUT\n");
            err = TestReadsCurrentLevelAttributeFromDut_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : Set OnLevel attribute to null\n");
            err = TestSetOnLevelAttributeToNull_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : Wait 100 ms\n");
            err = TestWait100Ms_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : Read OnLevel attribute\n");
            err = TestReadOnLevelAttribute_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : Send On Command\n");
            err = TestSendOnCommand_25();
            break;
        case 26:
            ChipLogProgress(chipTool, " ***** Test Step 26 : Check on/off attribute value is true after on command\n");
            err = TestCheckOnOffAttributeValueIsTrueAfterOnCommand_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : Wait OnOffTransitionTime\n");
            err = TestWaitOnOffTransitionTime_27();
            break;
        case 28:
            ChipLogProgress(chipTool, " ***** Test Step 28 : If OnLevel is not defined, check CurrentLevel is restored\n");
            err = TestIfOnLevelIsNotDefinedCheckCurrentLevelIsRestored_28();
            break;
        case 29:
            ChipLogProgress(chipTool, " ***** Test Step 29 : Send Off Command\n");
            err = TestSendOffCommand_29();
            break;
        case 30:
            ChipLogProgress(chipTool, " ***** Test Step 30 : Check on/off attribute value is false after off command\n");
            err = TestCheckOnOffAttributeValueIsFalseAfterOffCommand_30();
            break;
        case 31:
            ChipLogProgress(chipTool, " ***** Test Step 31 : Wait OnOffTransitionTime\n");
            err = TestWaitOnOffTransitionTime_31();
            break;
        case 32:
            ChipLogProgress(chipTool, " ***** Test Step 32 : If OnLevel is not defined, check CurrentLevel is restored\n");
            err = TestIfOnLevelIsNotDefinedCheckCurrentLevelIsRestored_32();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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));
            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));
            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));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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));
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 33;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestSendsAMoveToLevelCommandToSetCurrentLevelToMinValue_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterMoveToLevelParams alloc] init];
        params.level = [NSNumber numberWithUnsignedChar:1U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:1U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:1U];
        [cluster moveToLevelWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"Sends a MoveToLevel command to set CurrentLevel to min value Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100Ms_2()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestReadsCurrentLevelAttributeFromDut_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteOnOffTransitionTimeAttribute_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id onOffTransitionTimeArgument;
        onOffTransitionTimeArgument = [NSNumber numberWithUnsignedShort:0U];
        [cluster writeAttributeOnOffTransitionTimeWithValue:onOffTransitionTimeArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"Write OnOffTransitionTime attribute Error: %@", err);

                                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100Ms_5()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestReadOnOffTransitionTimeAttribute_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffTransitionTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read OnOffTransitionTime attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOffTransitionTime", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteOnLevelAttribute_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id onLevelArgument;
        onLevelArgument = [NSNumber numberWithUnsignedChar:254U];
        [cluster writeAttributeOnLevelWithValue:onLevelArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Write OnLevel attribute Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100Ms_8()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestReadOnLevelAttribute_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read OnLevel attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("OnLevel", actualValue));
                VerifyOrReturn(CheckValue("OnLevel", actualValue, 254U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadMinValueAttribute_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read MinValue attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("MinLevel", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendOnCommand_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Send On Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsTrueAfterOnCommand_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is true after on command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 1));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWaitOnOffTransitionTime_13()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestIfOnLevelIsDefinedCheckCurrentLevelIsOnLevelValue_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"If OnLevel is defined, check CurrentLevel is OnLevel value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 254U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendOffCommand_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Send Off Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is false after off command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWaitOnOffTransitionTime_17()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 0UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestIfOnLevelIsDefinedCheckCurrentLevelIsMinValue_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"If OnLevel is defined, check CurrentLevel is min value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendsAMoveToLevelCommandToSetCurrentLevelToAMidValue_19()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRLevelControlClusterMoveToLevelParams alloc] init];
        params.level = [NSNumber numberWithUnsignedChar:127U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:1U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:1U];
        [cluster moveToLevelWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"Sends a MoveToLevel command to set CurrentLevel to a mid value Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100Ms_20()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestReadsCurrentLevelAttributeFromDut_21()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads CurrentLevel attribute from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 127U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSetOnLevelAttributeToNull_22()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id onLevelArgument;
        onLevelArgument = nil;
        [cluster writeAttributeOnLevelWithValue:onLevelArgument
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Set OnLevel attribute to null Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait100Ms_23()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestReadOnLevelAttribute_24()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read OnLevel attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("OnLevel", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendOnCommand_25()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Send On Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsTrueAfterOnCommand_26()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is true after on command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 1));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWaitOnOffTransitionTime_27()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestIfOnLevelIsNotDefinedCheckCurrentLevelIsRestored_28()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"If OnLevel is not defined, check CurrentLevel is restored Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 127U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendOffCommand_29()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Send Off Command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_30()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check on/off attribute value is false after off command Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, 0));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWaitOnOffTransitionTime_31()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 0UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestIfOnLevelIsNotDefinedCheckCurrentLevelIsRestored_32()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"If OnLevel is not defined, check CurrentLevel is restored Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("CurrentLevel", actualValue));
                VerifyOrReturn(CheckValue("CurrentLevel", actualValue, 127U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class TestCommissioningWindow : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestCommissioningWindow()
        : TestCommandBridge("TestCommissioningWindow")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("nodeId2", 0, UINT64_MAX, &mNodeId2);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("cluster", &mCluster);
        AddArgument("discriminator", 0, UINT16_MAX, &mDiscriminator);
        AddArgument("payload", &mPayload);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestCommissioningWindow() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestCommissioningWindow\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestCommissioningWindow\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved for alpha\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrievedForAlpha_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Get alpha's fabric index\n");
            err = TestGetAlphasFabricIndex_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Check that commissioning window is not open\n");
            err = TestCheckThatCommissioningWindowIsNotOpen_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Check that there is no AdminFabricIndex\n");
            err = TestCheckThatThereIsNoAdminFabricIndex_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Check that there is no AdminVendorId\n");
            err = TestCheckThatThereIsNoAdminVendorId_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Open Commissioning Window from alpha\n");
            err = TestOpenCommissioningWindowFromAlpha_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Check that commissioning window is open\n");
            err = TestCheckThatCommissioningWindowIsOpen_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Check the AdminFabricIndex\n");
            err = TestCheckTheAdminFabricIndex_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Check the AdminVendorId is not null\n");
            err = TestCheckTheAdminVendorIdIsNotNull_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Close Commissioning Window\n");
            err = TestCloseCommissioningWindow_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Check that commissioning window is again not open\n");
            err = TestCheckThatCommissioningWindowIsAgainNotOpen_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Check that again there is no AdminFabricIndex\n");
            err = TestCheckThatAgainThereIsNoAdminFabricIndex_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Check that again there is no AdminVendorId\n");
            err = TestCheckThatAgainThereIsNoAdminVendorId_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Open Commissioning Window from alpha again\n");
            err = TestOpenCommissioningWindowFromAlphaAgain_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Commission from beta\n");
            err = TestCommissionFromBeta_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Wait for the commissioned device to be retrieved for beta\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrievedForBeta_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Check that commissioning window is not open for the third time\n");
            err = TestCheckThatCommissioningWindowIsNotOpenForTheThirdTime_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Check that there is no AdminFabricIndex for the third time\n");
            err = TestCheckThatThereIsNoAdminFabricIndexForTheThirdTime_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Check that there is no AdminVendorId for the third time\n");
            err = TestCheckThatThereIsNoAdminVendorIdForTheThirdTime_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Get beta's fabric index\n");
            err = TestGetBetasFabricIndex_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Open Commissioning Window from beta\n");
            err = TestOpenCommissioningWindowFromBeta_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Check that commissioning window is open again\n");
            err = TestCheckThatCommissioningWindowIsOpenAgain_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : Check the AdminFabricIndex again\n");
            err = TestCheckTheAdminFabricIndexAgain_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : Check the AdminVendorId is not null again\n");
            err = TestCheckTheAdminVendorIdIsNotNullAgain_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : Remove beta fabric\n");
            err = TestRemoveBetaFabric_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : Check that commissioning window is still open\n");
            err = TestCheckThatCommissioningWindowIsStillOpen_25();
            break;
        case 26:
            ChipLogProgress(chipTool, " ***** Test Step 26 : Check the AdminFabricIndex got reset\n");
            err = TestCheckTheAdminFabricIndexGotReset_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : Check the AdminVendorId did not get reset\n");
            err = TestCheckTheAdminVendorIdDidNotGetReset_27();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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));
            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));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 28;

    chip::Optional<chip::NodeId> mNodeId;
    chip::Optional<chip::NodeId> mNodeId2;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<chip::CharSpan> mCluster;
    chip::Optional<uint16_t> mDiscriminator;
    chip::Optional<chip::CharSpan> mPayload;
    chip::Optional<uint16_t> mTimeout;

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrievedForAlpha_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }
    NSNumber * _Nonnull alphaIndex;

    CHIP_ERROR TestGetAlphasFabricIndex_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentFabricIndexWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Get alpha's fabric index Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                alphaIndex = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckThatCommissioningWindowIsNotOpen_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeWindowStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check that commissioning window is not open Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("WindowStatus", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckThatThereIsNoAdminFabricIndex_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAdminFabricIndexWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check that there is no AdminFabricIndex Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("AdminFabricIndex", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckThatThereIsNoAdminVendorId_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAdminVendorIdWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check that there is no AdminVendorId Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("AdminVendorId", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestOpenCommissioningWindowFromAlpha_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRAdministratorCommissioningClusterOpenBasicCommissioningWindowParams alloc] init];
        params.commissioningTimeout = [NSNumber numberWithUnsignedShort:180U];
        [cluster openBasicCommissioningWindowWithParams:params
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"Open Commissioning Window from alpha Error: %@", err);

                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckThatCommissioningWindowIsOpen_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeWindowStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check that commissioning window is open Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("WindowStatus", actualValue, 2U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckTheAdminFabricIndex_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAdminFabricIndexWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check the AdminFabricIndex Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                if (alphaIndex == nil) {
                    VerifyOrReturn(CheckValueNull("AdminFabricIndex", actualValue));
                } else {
                    VerifyOrReturn(CheckValueNonNull("AdminFabricIndex", actualValue));
                    VerifyOrReturn(CheckValue("AdminFabricIndex", actualValue, alphaIndex));
                }
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckTheAdminVendorIdIsNotNull_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAdminVendorIdWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check the AdminVendorId is not null Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckValueNonNull("adminVendorId", value));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCloseCommissioningWindow_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster revokeCommissioningWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Close Commissioning Window Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckThatCommissioningWindowIsAgainNotOpen_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeWindowStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check that commissioning window is again not open Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("WindowStatus", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckThatAgainThereIsNoAdminFabricIndex_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAdminFabricIndexWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check that again there is no AdminFabricIndex Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("AdminFabricIndex", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckThatAgainThereIsNoAdminVendorId_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAdminVendorIdWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check that again there is no AdminVendorId Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("AdminVendorId", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestOpenCommissioningWindowFromAlphaAgain_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRAdministratorCommissioningClusterOpenBasicCommissioningWindowParams alloc] init];
        params.commissioningTimeout = [NSNumber numberWithUnsignedShort:180U];
        [cluster openBasicCommissioningWindowWithParams:params
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"Open Commissioning Window from alpha again Error: %@", err);

                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCommissionFromBeta_14()
    {

        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("beta", value);
    }

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrievedForBeta_15()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
        return WaitForCommissionee("beta", value);
    }

    CHIP_ERROR TestCheckThatCommissioningWindowIsNotOpenForTheThirdTime_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeWindowStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check that commissioning window is not open for the third time Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("WindowStatus", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckThatThereIsNoAdminFabricIndexForTheThirdTime_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAdminFabricIndexWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check that there is no AdminFabricIndex for the third time Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("AdminFabricIndex", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckThatThereIsNoAdminVendorIdForTheThirdTime_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAdminVendorIdWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check that there is no AdminVendorId for the third time Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("AdminVendorId", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull betaIndex;

    CHIP_ERROR TestGetBetasFabricIndex_19()
    {

        MTRBaseDevice * device = GetDevice("beta");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentFabricIndexWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Get beta's fabric index Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                betaIndex = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestOpenCommissioningWindowFromBeta_20()
    {

        MTRBaseDevice * device = GetDevice("beta");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRAdministratorCommissioningClusterOpenBasicCommissioningWindowParams alloc] init];
        params.commissioningTimeout = [NSNumber numberWithUnsignedShort:180U];
        [cluster openBasicCommissioningWindowWithParams:params
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"Open Commissioning Window from beta Error: %@", err);

                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckThatCommissioningWindowIsOpenAgain_21()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeWindowStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check that commissioning window is open again Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("WindowStatus", actualValue, 2U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckTheAdminFabricIndexAgain_22()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAdminFabricIndexWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check the AdminFabricIndex again Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                if (betaIndex == nil) {
                    VerifyOrReturn(CheckValueNull("AdminFabricIndex", actualValue));
                } else {
                    VerifyOrReturn(CheckValueNonNull("AdminFabricIndex", actualValue));
                    VerifyOrReturn(CheckValue("AdminFabricIndex", actualValue, betaIndex));
                }
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nullable adminVendorId;

    CHIP_ERROR TestCheckTheAdminVendorIdIsNotNullAgain_23()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAdminVendorIdWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check the AdminVendorId is not null again Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            if (value != nil) {
            }
            VerifyOrReturn(CheckValueNonNull("adminVendorId", value));
            {
                adminVendorId = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRemoveBetaFabric_24()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTROperationalCredentialsClusterRemoveFabricParams alloc] init];
        params.fabricIndex = [betaIndex copy];
        [cluster removeFabricWithParams:params
                             completion:^(
                                 MTROperationalCredentialsClusterNOCResponseParams * _Nullable values, NSError * _Nullable err) {
                                 NSLog(@"Remove beta fabric Error: %@", err);

                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                 NextTest();
                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckThatCommissioningWindowIsStillOpen_25()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeWindowStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check that commissioning window is still open Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("WindowStatus", actualValue, 2U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckTheAdminFabricIndexGotReset_26()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAdminFabricIndexWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check the AdminFabricIndex got reset Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNull("AdminFabricIndex", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckTheAdminVendorIdDidNotGetReset_27()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAdminVendorIdWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check the AdminVendorId did not get reset Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                if (adminVendorId == nil) {
                    VerifyOrReturn(CheckValueNull("AdminVendorId", actualValue));
                } else {
                    VerifyOrReturn(CheckValueNonNull("AdminVendorId", actualValue));
                    VerifyOrReturn(CheckValue("AdminVendorId", actualValue, adminVendorId));
                }
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class TestCommissionerNodeId : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestCommissionerNodeId()
        : TestCommandBridge("TestCommissionerNodeId")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("cluster", &mCluster);
        AddArgument("payload", &mPayload);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestCommissionerNodeId() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestCommissionerNodeId\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestCommissionerNodeId\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved for alpha\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrievedForAlpha_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Open Commissioning Window from alpha\n");
            err = TestOpenCommissioningWindowFromAlpha_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Commission from beta\n");
            err = TestCommissionFromBeta_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Wait for the commissioned device to be retrieved for beta\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrievedForBeta_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Open Commissioning Window from alpha\n");
            err = TestOpenCommissioningWindowFromAlpha_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Commission from gamma\n");
            err = TestCommissionFromGamma_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Wait for the commissioned device to be retrieved for gamma\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrievedForGamma_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read the fabric ID from the alpha fabric\n");
            err = TestReadTheFabricIdFromTheAlphaFabric_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read the fabric ID from the beta fabric\n");
            err = TestReadTheFabricIdFromTheBetaFabric_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Read the fabric ID from the gamma fabric\n");
            err = TestReadTheFabricIdFromTheGammaFabric_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Read the ACL from alpha and check commissioner node id\n");
            err = TestReadTheAclFromAlphaAndCheckCommissionerNodeId_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Read the ACL from beta and check commissioner node id\n");
            err = TestReadTheAclFromBetaAndCheckCommissionerNodeId_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Read the ACL from gamma and check commissioner node id\n");
            err = TestReadTheAclFromGammaAndCheckCommissionerNodeId_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Write the ACL using the commissioner node id value\n");
            err = TestWriteTheAclUsingTheCommissionerNodeIdValue_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Write the ACL using the commissioner node id value\n");
            err = TestWriteTheAclUsingTheCommissionerNodeIdValue_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Read the ACL from beta and check commissioner node id\n");
            err = TestReadTheAclFromBetaAndCheckCommissionerNodeId_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Read the ACL from gamma and check commissioner node id\n");
            err = TestReadTheAclFromGammaAndCheckCommissionerNodeId_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Remove beta fabric\n");
            err = TestRemoveBetaFabric_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Remove gamma fabric\n");
            err = TestRemoveGammaFabric_18();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 19;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrievedForAlpha_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestOpenCommissioningWindowFromAlpha_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRAdministratorCommissioningClusterOpenBasicCommissioningWindowParams alloc] init];
        params.commissioningTimeout = [NSNumber numberWithUnsignedShort:180U];
        [cluster openBasicCommissioningWindowWithParams:params
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"Open Commissioning Window from alpha Error: %@", err);

                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCommissionFromBeta_2()
    {

        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("beta", value);
    }

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrievedForBeta_3()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("beta", value);
    }

    CHIP_ERROR TestOpenCommissioningWindowFromAlpha_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRAdministratorCommissioningClusterOpenBasicCommissioningWindowParams alloc] init];
        params.commissioningTimeout = [NSNumber numberWithUnsignedShort:180U];
        [cluster openBasicCommissioningWindowWithParams:params
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"Open Commissioning Window from alpha Error: %@", err);

                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCommissionFromGamma_5()
    {

        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("gamma", value);
    }

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrievedForGamma_6()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("gamma", value);
    }
    NSNumber * _Nonnull alphaIndex;

    CHIP_ERROR TestReadTheFabricIdFromTheAlphaFabric_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentFabricIndexWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the fabric ID from the alpha fabric Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                alphaIndex = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull betaIndex;

    CHIP_ERROR TestReadTheFabricIdFromTheBetaFabric_8()
    {

        MTRBaseDevice * device = GetDevice("beta");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentFabricIndexWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the fabric ID from the beta fabric Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                betaIndex = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull gammaIndex;

    CHIP_ERROR TestReadTheFabricIdFromTheGammaFabric_9()
    {

        MTRBaseDevice * device = GetDevice("gamma");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentFabricIndexWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the fabric ID from the gamma fabric Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                gammaIndex = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheAclFromAlphaAndCheckCommissionerNodeId_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRReadParams alloc] init];
        params.filterByFabric = true;
        [cluster readAttributeACLWithParams:params
                                 completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                     NSLog(@"Read the ACL from alpha and check commissioner node id Error: %@", err);

                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                     {
                                         id actualValue = value;
                                         VerifyOrReturn(CheckValue("ACL", [actualValue count], static_cast<uint32_t>(1)));
                                         VerifyOrReturn(CheckValue("Privilege",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).privilege, 5U));
                                         VerifyOrReturn(CheckValue("AuthMode",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).authMode, 2U));
                                         VerifyOrReturn(CheckValueNonNull("Subjects",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).subjects));
                                         VerifyOrReturn(CheckValue("Subjects",
                                             [((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).subjects count],
                                             static_cast<uint32_t>(1)));
                                         VerifyOrReturn(CheckValue("",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).subjects[0],
                                             commissionerNodeId));
                                         VerifyOrReturn(CheckValueNull("Targets",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).targets));
                                         VerifyOrReturn(CheckValue("FabricIndex",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).fabricIndex,
                                             alphaIndex));
                                     }

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheAclFromBetaAndCheckCommissionerNodeId_11()
    {

        MTRBaseDevice * device = GetDevice("beta");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRReadParams alloc] init];
        params.filterByFabric = true;
        [cluster readAttributeACLWithParams:params
                                 completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                     NSLog(@"Read the ACL from beta and check commissioner node id Error: %@", err);

                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                     {
                                         id actualValue = value;
                                         VerifyOrReturn(CheckValue("ACL", [actualValue count], static_cast<uint32_t>(1)));
                                         VerifyOrReturn(CheckValue("Privilege",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).privilege, 5U));
                                         VerifyOrReturn(CheckValue("AuthMode",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).authMode, 2U));
                                         VerifyOrReturn(CheckValueNonNull("Subjects",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).subjects));
                                         VerifyOrReturn(CheckValue("Subjects",
                                             [((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).subjects count],
                                             static_cast<uint32_t>(1)));
                                         VerifyOrReturn(CheckValue("",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).subjects[0],
                                             commissionerNodeId));
                                         VerifyOrReturn(CheckValueNull("Targets",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).targets));
                                         VerifyOrReturn(CheckValue("FabricIndex",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).fabricIndex,
                                             betaIndex));
                                     }

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheAclFromGammaAndCheckCommissionerNodeId_12()
    {

        MTRBaseDevice * device = GetDevice("gamma");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRReadParams alloc] init];
        params.filterByFabric = true;
        [cluster readAttributeACLWithParams:params
                                 completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                     NSLog(@"Read the ACL from gamma and check commissioner node id Error: %@", err);

                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                     {
                                         id actualValue = value;
                                         VerifyOrReturn(CheckValue("ACL", [actualValue count], static_cast<uint32_t>(1)));
                                         VerifyOrReturn(CheckValue("Privilege",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).privilege, 5U));
                                         VerifyOrReturn(CheckValue("AuthMode",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).authMode, 2U));
                                         VerifyOrReturn(CheckValueNonNull("Subjects",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).subjects));
                                         VerifyOrReturn(CheckValue("Subjects",
                                             [((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).subjects count],
                                             static_cast<uint32_t>(1)));
                                         VerifyOrReturn(CheckValue("",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).subjects[0],
                                             commissionerNodeId));
                                         VerifyOrReturn(CheckValueNull("Targets",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).targets));
                                         VerifyOrReturn(CheckValue("FabricIndex",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).fabricIndex,
                                             gammaIndex));
                                     }

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteTheAclUsingTheCommissionerNodeIdValue_13()
    {

        MTRBaseDevice * device = GetDevice("beta");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id aclArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:commissionerNodeId];
                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).fabricIndex = [betaIndex copy];

            aclArgument = temp_0;
        }
        [cluster writeAttributeACLWithValue:aclArgument
                                 completion:^(NSError * _Nullable err) {
                                     NSLog(@"Write the ACL using the commissioner node id value Error: %@", err);

                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteTheAclUsingTheCommissionerNodeIdValue_14()
    {

        MTRBaseDevice * device = GetDevice("gamma");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id aclArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRAccessControlClusterAccessControlEntryStruct alloc] init];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:commissionerNodeId];
                ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntryStruct *) temp_0[0]).fabricIndex = [gammaIndex copy];

            aclArgument = temp_0;
        }
        [cluster writeAttributeACLWithValue:aclArgument
                                 completion:^(NSError * _Nullable err) {
                                     NSLog(@"Write the ACL using the commissioner node id value Error: %@", err);

                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheAclFromBetaAndCheckCommissionerNodeId_15()
    {

        MTRBaseDevice * device = GetDevice("beta");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRReadParams alloc] init];
        params.filterByFabric = true;
        [cluster readAttributeACLWithParams:params
                                 completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                     NSLog(@"Read the ACL from beta and check commissioner node id Error: %@", err);

                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                     {
                                         id actualValue = value;
                                         VerifyOrReturn(CheckValue("ACL", [actualValue count], static_cast<uint32_t>(1)));
                                         VerifyOrReturn(CheckValue("Privilege",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).privilege, 5U));
                                         VerifyOrReturn(CheckValue("AuthMode",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).authMode, 2U));
                                         VerifyOrReturn(CheckValueNonNull("Subjects",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).subjects));
                                         VerifyOrReturn(CheckValue("Subjects",
                                             [((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).subjects count],
                                             static_cast<uint32_t>(1)));
                                         VerifyOrReturn(CheckValue("",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).subjects[0],
                                             commissionerNodeId));
                                         VerifyOrReturn(CheckValueNull("Targets",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).targets));
                                         VerifyOrReturn(CheckValue("FabricIndex",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).fabricIndex,
                                             betaIndex));
                                     }

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheAclFromGammaAndCheckCommissionerNodeId_16()
    {

        MTRBaseDevice * device = GetDevice("gamma");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRReadParams alloc] init];
        params.filterByFabric = true;
        [cluster readAttributeACLWithParams:params
                                 completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                     NSLog(@"Read the ACL from gamma and check commissioner node id Error: %@", err);

                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                     {
                                         id actualValue = value;
                                         VerifyOrReturn(CheckValue("ACL", [actualValue count], static_cast<uint32_t>(1)));
                                         VerifyOrReturn(CheckValue("Privilege",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).privilege, 5U));
                                         VerifyOrReturn(CheckValue("AuthMode",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).authMode, 2U));
                                         VerifyOrReturn(CheckValueNonNull("Subjects",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).subjects));
                                         VerifyOrReturn(CheckValue("Subjects",
                                             [((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).subjects count],
                                             static_cast<uint32_t>(1)));
                                         VerifyOrReturn(CheckValue("",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).subjects[0],
                                             commissionerNodeId));
                                         VerifyOrReturn(CheckValueNull("Targets",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).targets));
                                         VerifyOrReturn(CheckValue("FabricIndex",
                                             ((MTRAccessControlClusterAccessControlEntryStruct *) actualValue[0]).fabricIndex,
                                             gammaIndex));
                                     }

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRemoveBetaFabric_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTROperationalCredentialsClusterRemoveFabricParams alloc] init];
        params.fabricIndex = [betaIndex copy];
        [cluster removeFabricWithParams:params
                             completion:^(
                                 MTROperationalCredentialsClusterNOCResponseParams * _Nullable values, NSError * _Nullable err) {
                                 NSLog(@"Remove beta fabric Error: %@", err);

                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                 NextTest();
                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRemoveGammaFabric_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTROperationalCredentialsClusterRemoveFabricParams alloc] init];
        params.fabricIndex = [gammaIndex copy];
        [cluster removeFabricWithParams:params
                             completion:^(
                                 MTROperationalCredentialsClusterNOCResponseParams * _Nullable values, NSError * _Nullable err) {
                                 NSLog(@"Remove gamma fabric Error: %@", err);

                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                 NextTest();
                             }];

        return CHIP_NO_ERROR;
    }
};

class TestMultiAdmin : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestMultiAdmin()
        : TestCommandBridge("TestMultiAdmin")
        , mTestIndex(0)
    {
        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);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestMultiAdmin() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestMultiAdmin\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestMultiAdmin\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Stop target device\n");
            err = TestStopTargetDevice_0();
            break;
        case 1:
            ChipLogProgress(chipTool,
                " ***** Test Step 1 : Start target device with the provided discriminator for basic commissioning advertisement\n");
            err = TestStartTargetDeviceWithTheProvidedDiscriminatorForBasicCommissioningAdvertisement_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Wait for the commissioned device to be retrieved for alpha\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrievedForAlpha_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Commission from alpha when the commissioning window is not opened\n");
            err = TestCommissionFromAlphaWhenTheCommissioningWindowIsNotOpened_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Open Commissioning Window from alpha\n");
            err = TestOpenCommissioningWindowFromAlpha_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Commission from alpha again\n");
            err = TestCommissionFromAlphaAgain_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Check that we just have the one fabric and did not add a new one\n");
            err = TestCheckThatWeJustHaveTheOneFabricAndDidNotAddANewOne_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Close Commissioning Window after failed commissioning\n");
            err = TestCloseCommissioningWindowAfterFailedCommissioning_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Open Commissioning Window from alpha again\n");
            err = TestOpenCommissioningWindowFromAlphaAgain_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Commission from beta\n");
            err = TestCommissionFromBeta_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Wait for the commissioned device to be retrieved for beta\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrievedForBeta_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Open Commissioning Window from beta\n");
            err = TestOpenCommissioningWindowFromBeta_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Commission from gamma\n");
            err = TestCommissionFromGamma_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Wait for the commissioned device to be retrieved for gamma\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrievedForGamma_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : read the mandatory attribute: NodeLabel from alpha\n");
            err = TestReadTheMandatoryAttributeNodeLabelFromAlpha_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : write the mandatory attribute NodeLabel from beta\n");
            err = TestWriteTheMandatoryAttributeNodeLabelFromBeta_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : read the mandatory attribute: NodeLabel from gamma\n");
            err = TestReadTheMandatoryAttributeNodeLabelFromGamma_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : write the mandatory attribute NodeLabel back to default\n");
            err = TestWriteTheMandatoryAttributeNodeLabelBackToDefault_17();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), EMBER_ZCL_STATUS_FAILURE));
            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));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 18;

    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;

    CHIP_ERROR TestStopTargetDevice_0()
    {

        chip::app::Clusters::SystemCommands::Commands::Stop::Type value;
        return Stop("alpha", value);
    }

    CHIP_ERROR TestStartTargetDeviceWithTheProvidedDiscriminatorForBasicCommissioningAdvertisement_1()
    {

        chip::app::Clusters::SystemCommands::Commands::Start::Type value;
        value.discriminator.Emplace();
        value.discriminator.Value() = mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840U;
        return Start("alpha", value);
    }

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrievedForAlpha_2()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestCommissionFromAlphaWhenTheCommissioningWindowIsNotOpened_3()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestOpenCommissioningWindowFromAlpha_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRAdministratorCommissioningClusterOpenBasicCommissioningWindowParams alloc] init];
        params.commissioningTimeout = [NSNumber numberWithUnsignedShort:180U];
        [cluster openBasicCommissioningWindowWithParams:params
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"Open Commissioning Window from alpha Error: %@", err);

                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCommissionFromAlphaAgain_5()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestCheckThatWeJustHaveTheOneFabricAndDidNotAddANewOne_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRReadParams alloc] init];
        params.filterByFabric = false;
        [cluster readAttributeFabricsWithParams:params
                                     completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                         NSLog(@"Check that we just have the one fabric and did not add a new one Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         {
                                             id actualValue = value;
                                             VerifyOrReturn(CheckValue("Fabrics", [actualValue count], static_cast<uint32_t>(1)));
                                             VerifyOrReturn(CheckValue("NodeID",
                                                 ((MTROperationalCredentialsClusterFabricDescriptorStruct *) actualValue[0]).nodeID,
                                                 mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL));
                                         }

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCloseCommissioningWindowAfterFailedCommissioning_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster revokeCommissioningWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Close Commissioning Window after failed commissioning Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestOpenCommissioningWindowFromAlphaAgain_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRAdministratorCommissioningClusterOpenBasicCommissioningWindowParams alloc] init];
        params.commissioningTimeout = [NSNumber numberWithUnsignedShort:180U];
        [cluster openBasicCommissioningWindowWithParams:params
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"Open Commissioning Window from alpha again Error: %@", err);

                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCommissionFromBeta_9()
    {

        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("beta", value);
    }

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrievedForBeta_10()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
        return WaitForCommissionee("beta", value);
    }

    CHIP_ERROR TestOpenCommissioningWindowFromBeta_11()
    {

        MTRBaseDevice * device = GetDevice("beta");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRAdministratorCommissioningClusterOpenBasicCommissioningWindowParams alloc] init];
        params.commissioningTimeout = [NSNumber numberWithUnsignedShort:180U];
        [cluster openBasicCommissioningWindowWithParams:params
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"Open Commissioning Window from beta Error: %@", err);

                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCommissionFromGamma_12()
    {

        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("gamma", value);
    }

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrievedForGamma_13()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId3.HasValue() ? mNodeId3.Value() : 12586990ULL;
        return WaitForCommissionee("gamma", value);
    }
    NSString * _Nonnull readFromAlpha;

    CHIP_ERROR TestReadTheMandatoryAttributeNodeLabelFromAlpha_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBasicInformation alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNodeLabelWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"read the mandatory attribute: NodeLabel from alpha Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueAsString("NodeLabel", actualValue, @""));
            }
            {
                readFromAlpha = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteTheMandatoryAttributeNodeLabelFromBeta_15()
    {

        MTRBaseDevice * device = GetDevice("beta");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBasicInformation alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nodeLabelArgument;
        nodeLabelArgument = @"written from beta";
        [cluster writeAttributeNodeLabelWithValue:nodeLabelArgument
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(@"write the mandatory attribute NodeLabel from beta Error: %@", err);

                                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheMandatoryAttributeNodeLabelFromGamma_16()
    {

        MTRBaseDevice * device = GetDevice("gamma");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBasicInformation alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNodeLabelWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
            NSLog(@"read the mandatory attribute: NodeLabel from gamma Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintNotValue("nodeLabel", value, readFromAlpha));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteTheMandatoryAttributeNodeLabelBackToDefault_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterBasicInformation alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nodeLabelArgument;
        nodeLabelArgument = [readFromAlpha copy];
        [cluster writeAttributeNodeLabelWithValue:nodeLabelArgument
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(@"write the mandatory attribute NodeLabel back to default Error: %@", err);

                                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGSW_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_DGSW_1_1()
        : TestCommandBridge("Test_TC_DGSW_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_DGSW_1_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_DGSW_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_DGSW_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads the ClusterRevision from DUT\n");
            err = TestThReadsTheClusterRevisionFromDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads the FeatureMap from DUT\n");
            if (ShouldSkip(" !DGSW.S.F00 ")) {
                NextTest();
                return;
            }
            err = TestThReadsTheFeatureMapFromDut_2();
            break;
        case 3:
            ChipLogProgress(
                chipTool, " ***** Test Step 3 : Given DGSW.S.F00(Watermarks) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("DGSW.S.F00")) {
                NextTest();
                return;
            }
            err = TestGivenDGSWSF00WatermarksEnsureFeaturemapHasTheCorrectBitSet_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH reads AttributeList from DUT\n");
            err = TestThReadsAttributeListFromDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH reads optional attribute(ThreadMetrics) in AttributeList\n");
            if (ShouldSkip("DGSW.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeThreadMetricsInAttributeList_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : TH reads optional attribute(CurrentHeapFree) in AttributeList\n");
            if (ShouldSkip("DGSW.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeCurrentHeapFreeInAttributeList_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH reads optional attribute(CurrentHeapUsed) in AttributeList\n");
            if (ShouldSkip("DGSW.S.A0002")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeCurrentHeapUsedInAttributeList_7();
            break;
        case 8:
            ChipLogProgress(
                chipTool, " ***** Test Step 8 : TH reads Feature dependent attribute(CurrentHeapHighWatermark) in AttributeList\n");
            if (ShouldSkip("DGSW.S.F00 || DGSW.S.A0003")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentAttributeCurrentHeapHighWatermarkInAttributeList_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH reads AcceptedCommandList from DUT\n");
            if (ShouldSkip("DGSW.S.F00")) {
                NextTest();
                return;
            }
            err = TestThReadsAcceptedCommandListFromDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : TH reads AcceptedCommandList from DUT\n");
            if (ShouldSkip(" !DGSW.S.F00 ")) {
                NextTest();
                return;
            }
            err = TestThReadsAcceptedCommandListFromDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : TH reads GeneratedCommandList from DUT\n");
            err = TestThReadsGeneratedCommandListFromDut_11();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 12;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheClusterRevisionFromDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
                                                                               endpointID:@(0)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the ClusterRevision from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 1U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheFeatureMapFromDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
                                                                               endpointID:@(0)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the FeatureMap from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenDGSWSF00WatermarksEnsureFeaturemapHasTheCorrectBitSet_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
                                                                               endpointID:@(0)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given DGSW.S.F00(Watermarks) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAttributeListFromDut_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
                                                                               endpointID:@(0)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AttributeList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeThreadMetricsInAttributeList_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
                                                                               endpointID:@(0)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(ThreadMetrics) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeCurrentHeapFreeInAttributeList_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
                                                                               endpointID:@(0)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(CurrentHeapFree) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeCurrentHeapUsedInAttributeList_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
                                                                               endpointID:@(0)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(CurrentHeapUsed) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentAttributeCurrentHeapHighWatermarkInAttributeList_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
                                                                               endpointID:@(0)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent attribute(CurrentHeapHighWatermark) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAcceptedCommandListFromDut_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
                                                                               endpointID:@(0)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AcceptedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAcceptedCommandListFromDut_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
                                                                               endpointID:@(0)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AcceptedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AcceptedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsGeneratedCommandListFromDut_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
                                                                               endpointID:@(0)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads GeneratedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("GeneratedCommandList", [actualValue count], static_cast<uint32_t>(0)));
            }

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class TestSubscribe_OnOff : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestSubscribe_OnOff()
        : TestCommandBridge("TestSubscribe_OnOff")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestSubscribe_OnOff() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestSubscribe_OnOff\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestSubscribe_OnOff\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Set OnOff Attribute to false\n");
            err = TestSetOnOffAttributeToFalse_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Report: Subscribe OnOff Attribute\n");
            err = TestReportSubscribeOnOffAttribute_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Subscribe OnOff Attribute\n");
            err = TestSubscribeOnOffAttribute_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Turn On the light to see attribute change\n");
            err = TestTurnOnTheLightToSeeAttributeChange_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Check for attribute report\n");
            err = TestCheckForAttributeReport_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Turn Off the light to see attribute change\n");
            err = TestTurnOffTheLightToSeeAttributeChange_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Check for attribute report\n");
            err = TestCheckForAttributeReport_7();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 8;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestSetOnOffAttributeToFalse_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Set OnOff Attribute to false Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    bool testSendClusterTestSubscribe_OnOff_2_WaitForReport_Fulfilled = false;
    ResponseHandler _Nullable test_TestSubscribe_OnOff_OnOff_Reported = nil;

    CHIP_ERROR TestReportSubscribeOnOffAttribute_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        test_TestSubscribe_OnOff_OnOff_Reported = ^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Report: Subscribe OnOff Attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, false));
            }

            testSendClusterTestSubscribe_OnOff_2_WaitForReport_Fulfilled = true;
        };

        NextTest();
        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSubscribeOnOffAttribute_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        uint16_t minIntervalArgument = 2U;
        uint16_t maxIntervalArgument = 5U;
        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(minIntervalArgument)
                                                                   maxInterval:@(maxIntervalArgument)];
        params.filterByFabric = true;
        params.replaceExistingSubscriptions = true;
        [cluster subscribeAttributeOnOffWithParams:params
            subscriptionEstablished:^{
                VerifyOrReturn(
                    testSendClusterTestSubscribe_OnOff_2_WaitForReport_Fulfilled, SetCommandExitStatus(CHIP_ERROR_INCORRECT_STATE));
                NextTest();
            }
            reportHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"Subscribe OnOff Attribute Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
                if (test_TestSubscribe_OnOff_OnOff_Reported != nil) {
                    ResponseHandler callback = test_TestSubscribe_OnOff_OnOff_Reported;
                    test_TestSubscribe_OnOff_OnOff_Reported = nil;
                    callback(value, err);
                }
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTurnOnTheLightToSeeAttributeChange_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Turn On the light to see attribute change Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckForAttributeReport_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        test_TestSubscribe_OnOff_OnOff_Reported = ^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check for attribute report Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, true));
            }

            NextTest();
        };

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTurnOffTheLightToSeeAttributeChange_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Turn Off the light to see attribute change Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckForAttributeReport_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        test_TestSubscribe_OnOff_OnOff_Reported = ^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check for attribute report Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OnOff", actualValue, false));
            }

            NextTest();
        };

        return CHIP_NO_ERROR;
    }
};

class TestSubscribe_AdministratorCommissioning : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestSubscribe_AdministratorCommissioning()
        : TestCommandBridge("TestSubscribe_AdministratorCommissioning")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("ourVendorId", 0, UINT16_MAX, &mOurVendorId);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestSubscribe_AdministratorCommissioning() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestSubscribe_AdministratorCommissioning\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestSubscribe_AdministratorCommissioning\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Get ourfabric index\n");
            err = TestGetOurfabricIndex_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Report: Subscribe WindowStatus Attribute\n");
            err = TestReportSubscribeWindowStatusAttribute_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Subscribe WindowStatus Attribute\n");
            err = TestSubscribeWindowStatusAttribute_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Open the commissioning window 1\n");
            err = TestOpenTheCommissioningWindow1_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Check for first attribute report for WindowStatus\n");
            err = TestCheckForFirstAttributeReportForWindowStatus_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Close the commissioning window 1\n");
            err = TestCloseTheCommissioningWindow1_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Check for second attribute report for WindowStatus\n");
            err = TestCheckForSecondAttributeReportForWindowStatus_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Report: Subscribe AdminVendorId Attribute\n");
            err = TestReportSubscribeAdminVendorIdAttribute_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Subscribe AdminVendorId Attribute\n");
            err = TestSubscribeAdminVendorIdAttribute_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Open the commissioning window 2\n");
            err = TestOpenTheCommissioningWindow2_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Check for first attribute report for AdminVendorId\n");
            err = TestCheckForFirstAttributeReportForAdminVendorId_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Close the commissioning window 2\n");
            err = TestCloseTheCommissioningWindow2_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Check for second attribute report for AdminVendorId\n");
            err = TestCheckForSecondAttributeReportForAdminVendorId_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Report: Subscribe AdminFabricIndex Attribute\n");
            err = TestReportSubscribeAdminFabricIndexAttribute_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Subscribe AdminFabricIndex Attribute\n");
            err = TestSubscribeAdminFabricIndexAttribute_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Open the commissioning window 3\n");
            err = TestOpenTheCommissioningWindow3_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Check for first attribute report for AdminFabricIndex\n");
            err = TestCheckForFirstAttributeReportForAdminFabricIndex_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Close the commissioning window 2\n");
            err = TestCloseTheCommissioningWindow2_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Check for second attribute report for AdminFabricIndex\n");
            err = TestCheckForSecondAttributeReportForAdminFabricIndex_19();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 20;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }
    NSNumber * _Nonnull ourFabricIndex;

    CHIP_ERROR TestGetOurfabricIndex_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
                                                                                  endpointID:@(0)
                                                                                       queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentFabricIndexWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Get ourfabric index Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                ourFabricIndex = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    bool testSendClusterTestSubscribe_AdministratorCommissioning_2_WaitForReport_Fulfilled = false;
    ResponseHandler _Nullable test_TestSubscribe_AdministratorCommissioning_WindowStatus_Reported = nil;

    CHIP_ERROR TestReportSubscribeWindowStatusAttribute_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        test_TestSubscribe_AdministratorCommissioning_WindowStatus_Reported
            = ^(NSNumber * _Nullable value, NSError * _Nullable err) {
                  NSLog(@"Report: Subscribe WindowStatus Attribute Error: %@", err);

                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                  {
                      id actualValue = value;
                      VerifyOrReturn(CheckValue("WindowStatus", actualValue, 0U));
                  }

                  testSendClusterTestSubscribe_AdministratorCommissioning_2_WaitForReport_Fulfilled = true;
              };

        NextTest();
        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSubscribeWindowStatusAttribute_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        uint16_t minIntervalArgument = 2U;
        uint16_t maxIntervalArgument = 50U;
        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(minIntervalArgument)
                                                                   maxInterval:@(maxIntervalArgument)];
        params.filterByFabric = true;
        params.replaceExistingSubscriptions = true;
        [cluster subscribeAttributeWindowStatusWithParams:params
            subscriptionEstablished:^{
                VerifyOrReturn(testSendClusterTestSubscribe_AdministratorCommissioning_2_WaitForReport_Fulfilled,
                    SetCommandExitStatus(CHIP_ERROR_INCORRECT_STATE));
                NextTest();
            }
            reportHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"Subscribe WindowStatus Attribute Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
                if (test_TestSubscribe_AdministratorCommissioning_WindowStatus_Reported != nil) {
                    ResponseHandler callback = test_TestSubscribe_AdministratorCommissioning_WindowStatus_Reported;
                    test_TestSubscribe_AdministratorCommissioning_WindowStatus_Reported = nil;
                    callback(value, err);
                }
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestOpenTheCommissioningWindow1_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRAdministratorCommissioningClusterOpenBasicCommissioningWindowParams alloc] init];
        params.commissioningTimeout = [NSNumber numberWithUnsignedShort:180U];
        [cluster openBasicCommissioningWindowWithParams:params
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"Open the commissioning window 1 Error: %@", err);

                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckForFirstAttributeReportForWindowStatus_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        test_TestSubscribe_AdministratorCommissioning_WindowStatus_Reported
            = ^(NSNumber * _Nullable value, NSError * _Nullable err) {
                  NSLog(@"Check for first attribute report for WindowStatus Error: %@", err);

                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                  {
                      id actualValue = value;
                      VerifyOrReturn(CheckValue("WindowStatus", actualValue, 2U));
                  }

                  NextTest();
              };

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCloseTheCommissioningWindow1_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster revokeCommissioningWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Close the commissioning window 1 Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckForSecondAttributeReportForWindowStatus_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        test_TestSubscribe_AdministratorCommissioning_WindowStatus_Reported
            = ^(NSNumber * _Nullable value, NSError * _Nullable err) {
                  NSLog(@"Check for second attribute report for WindowStatus Error: %@", err);

                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                  {
                      id actualValue = value;
                      VerifyOrReturn(CheckValue("WindowStatus", actualValue, 0U));
                  }

                  NextTest();
              };

        return CHIP_NO_ERROR;
    }
    bool testSendClusterTestSubscribe_AdministratorCommissioning_8_WaitForReport_Fulfilled = false;
    ResponseHandler _Nullable test_TestSubscribe_AdministratorCommissioning_AdminVendorId_Reported = nil;

    CHIP_ERROR TestReportSubscribeAdminVendorIdAttribute_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        test_TestSubscribe_AdministratorCommissioning_AdminVendorId_Reported
            = ^(NSNumber * _Nullable value, NSError * _Nullable err) {
                  NSLog(@"Report: Subscribe AdminVendorId Attribute Error: %@", err);

                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                  {
                      id actualValue = value;
                      VerifyOrReturn(CheckValueNull("AdminVendorId", actualValue));
                  }

                  testSendClusterTestSubscribe_AdministratorCommissioning_8_WaitForReport_Fulfilled = true;
              };

        NextTest();
        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSubscribeAdminVendorIdAttribute_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        uint16_t minIntervalArgument = 2U;
        uint16_t maxIntervalArgument = 50U;
        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(minIntervalArgument)
                                                                   maxInterval:@(maxIntervalArgument)];
        params.filterByFabric = true;
        params.replaceExistingSubscriptions = true;
        [cluster subscribeAttributeAdminVendorIdWithParams:params
            subscriptionEstablished:^{
                VerifyOrReturn(testSendClusterTestSubscribe_AdministratorCommissioning_8_WaitForReport_Fulfilled,
                    SetCommandExitStatus(CHIP_ERROR_INCORRECT_STATE));
                NextTest();
            }
            reportHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"Subscribe AdminVendorId Attribute Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
                if (test_TestSubscribe_AdministratorCommissioning_AdminVendorId_Reported != nil) {
                    ResponseHandler callback = test_TestSubscribe_AdministratorCommissioning_AdminVendorId_Reported;
                    test_TestSubscribe_AdministratorCommissioning_AdminVendorId_Reported = nil;
                    callback(value, err);
                }
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestOpenTheCommissioningWindow2_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRAdministratorCommissioningClusterOpenBasicCommissioningWindowParams alloc] init];
        params.commissioningTimeout = [NSNumber numberWithUnsignedShort:180U];
        [cluster openBasicCommissioningWindowWithParams:params
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"Open the commissioning window 2 Error: %@", err);

                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckForFirstAttributeReportForAdminVendorId_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        test_TestSubscribe_AdministratorCommissioning_AdminVendorId_Reported = ^(
            NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check for first attribute report for AdminVendorId Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("AdminVendorId", actualValue));
                VerifyOrReturn(CheckValue("AdminVendorId", actualValue, mOurVendorId.HasValue() ? mOurVendorId.Value() : 65521U));
            }

            NextTest();
        };

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCloseTheCommissioningWindow2_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster revokeCommissioningWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Close the commissioning window 2 Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckForSecondAttributeReportForAdminVendorId_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        test_TestSubscribe_AdministratorCommissioning_AdminVendorId_Reported
            = ^(NSNumber * _Nullable value, NSError * _Nullable err) {
                  NSLog(@"Check for second attribute report for AdminVendorId Error: %@", err);

                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                  {
                      id actualValue = value;
                      VerifyOrReturn(CheckValueNull("AdminVendorId", actualValue));
                  }

                  NextTest();
              };

        return CHIP_NO_ERROR;
    }
    bool testSendClusterTestSubscribe_AdministratorCommissioning_14_WaitForReport_Fulfilled = false;
    ResponseHandler _Nullable test_TestSubscribe_AdministratorCommissioning_AdminFabricIndex_Reported = nil;

    CHIP_ERROR TestReportSubscribeAdminFabricIndexAttribute_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        test_TestSubscribe_AdministratorCommissioning_AdminFabricIndex_Reported
            = ^(NSNumber * _Nullable value, NSError * _Nullable err) {
                  NSLog(@"Report: Subscribe AdminFabricIndex Attribute Error: %@", err);

                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                  {
                      id actualValue = value;
                      VerifyOrReturn(CheckValueNull("AdminFabricIndex", actualValue));
                  }

                  testSendClusterTestSubscribe_AdministratorCommissioning_14_WaitForReport_Fulfilled = true;
              };

        NextTest();
        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSubscribeAdminFabricIndexAttribute_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        uint16_t minIntervalArgument = 2U;
        uint16_t maxIntervalArgument = 50U;
        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(minIntervalArgument)
                                                                   maxInterval:@(maxIntervalArgument)];
        params.filterByFabric = true;
        params.replaceExistingSubscriptions = true;
        [cluster subscribeAttributeAdminFabricIndexWithParams:params
            subscriptionEstablished:^{
                VerifyOrReturn(testSendClusterTestSubscribe_AdministratorCommissioning_14_WaitForReport_Fulfilled,
                    SetCommandExitStatus(CHIP_ERROR_INCORRECT_STATE));
                NextTest();
            }
            reportHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"Subscribe AdminFabricIndex Attribute Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
                if (test_TestSubscribe_AdministratorCommissioning_AdminFabricIndex_Reported != nil) {
                    ResponseHandler callback = test_TestSubscribe_AdministratorCommissioning_AdminFabricIndex_Reported;
                    test_TestSubscribe_AdministratorCommissioning_AdminFabricIndex_Reported = nil;
                    callback(value, err);
                }
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestOpenTheCommissioningWindow3_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRAdministratorCommissioningClusterOpenBasicCommissioningWindowParams alloc] init];
        params.commissioningTimeout = [NSNumber numberWithUnsignedShort:180U];
        [cluster openBasicCommissioningWindowWithParams:params
                                             completion:^(NSError * _Nullable err) {
                                                 NSLog(@"Open the commissioning window 3 Error: %@", err);

                                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                 NextTest();
                                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckForFirstAttributeReportForAdminFabricIndex_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        test_TestSubscribe_AdministratorCommissioning_AdminFabricIndex_Reported
            = ^(NSNumber * _Nullable value, NSError * _Nullable err) {
                  NSLog(@"Check for first attribute report for AdminFabricIndex Error: %@", err);

                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                  {
                      id actualValue = value;
                      if (ourFabricIndex == nil) {
                          VerifyOrReturn(CheckValueNull("AdminFabricIndex", actualValue));
                      } else {
                          VerifyOrReturn(CheckValueNonNull("AdminFabricIndex", actualValue));
                          VerifyOrReturn(CheckValue("AdminFabricIndex", actualValue, ourFabricIndex));
                      }
                  }

                  NextTest();
              };

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCloseTheCommissioningWindow2_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster revokeCommissioningWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Close the commissioning window 2 Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckForSecondAttributeReportForAdminFabricIndex_19()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
                                                                                      endpointID:@(0)
                                                                                           queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        test_TestSubscribe_AdministratorCommissioning_AdminFabricIndex_Reported
            = ^(NSNumber * _Nullable value, NSError * _Nullable err) {
                  NSLog(@"Check for second attribute report for AdminFabricIndex Error: %@", err);

                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                  {
                      id actualValue = value;
                      VerifyOrReturn(CheckValueNull("AdminFabricIndex", actualValue));
                  }

                  NextTest();
              };

        return CHIP_NO_ERROR;
    }
};

class DL_UsersAndCredentials : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    DL_UsersAndCredentials()
        : TestCommandBridge("DL_UsersAndCredentials")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~DL_UsersAndCredentials() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: DL_UsersAndCredentials\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: DL_UsersAndCredentials\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read available user slot and verify response fields\n");
            err = TestReadAvailableUserSlotAndVerifyResponseFields_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Get number of supported users and verify default value\n");
            err = TestGetNumberOfSupportedUsersAndVerifyDefaultValue_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read fails for user with index 0\n");
            err = TestReadFailsForUserWithIndex0_3();
            break;
        case 4:
            ChipLogProgress(
                chipTool, " ***** Test Step 4 : Read fails for user with index greater than Number Of Users Supported\n");
            err = TestReadFailsForUserWithIndexGreaterThanNumberOfUsersSupported_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Create new user with default parameters\n");
            err = TestCreateNewUserWithDefaultParameters_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read the user back and verify its fields\n");
            err = TestReadTheUserBackAndVerifyItsFields_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Set user at the occupied index fails with appropriate response\n");
            err = TestSetUserAtTheOccupiedIndexFailsWithAppropriateResponse_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Modify userName for existing user\n");
            err = TestModifyUserNameForExistingUser_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Read the modified user back and verify its fields\n");
            err = TestReadTheModifiedUserBackAndVerifyItsFields_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Modify userUniqueId for existing user\n");
            err = TestModifyUserUniqueIdForExistingUser_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Read the modified user back and verify its fields\n");
            err = TestReadTheModifiedUserBackAndVerifyItsFields_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Modify userStatus for existing user\n");
            err = TestModifyUserStatusForExistingUser_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Read the modified user back and verify its fields\n");
            err = TestReadTheModifiedUserBackAndVerifyItsFields_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Modify userType for existing user\n");
            err = TestModifyUserTypeForExistingUser_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Read the modified user back and verify its fields\n");
            err = TestReadTheModifiedUserBackAndVerifyItsFields_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Modify credentialRule for existing user\n");
            err = TestModifyCredentialRuleForExistingUser_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Read the modified user back and verify its fields\n");
            err = TestReadTheModifiedUserBackAndVerifyItsFields_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Modify all fields for existing user\n");
            err = TestModifyAllFieldsForExistingUser_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Read the modified user back and verify its fields\n");
            err = TestReadTheModifiedUserBackAndVerifyItsFields_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Add another user with non-default fields\n");
            err = TestAddAnotherUserWithNonDefaultFields_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Read the new user back and verify its fields\n");
            err = TestReadTheNewUserBackAndVerifyItsFields_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : Try to add a user with userStatus 0\n");
            err = TestTryToAddAUserWithUserStatus0_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : Make sure the user did not get created\n");
            err = TestMakeSureTheUserDidNotGetCreated_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : Try to add a user with userStatus 2\n");
            err = TestTryToAddAUserWithUserStatus2_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : Make sure the user did not get created\n");
            err = TestMakeSureTheUserDidNotGetCreated_25();
            break;
        case 26:
            ChipLogProgress(chipTool, " ***** Test Step 26 : Try to add a user with userStatus 3\n");
            err = TestTryToAddAUserWithUserStatus3_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : Read the new third user back and verify its fields\n");
            err = TestReadTheNewThirdUserBackAndVerifyItsFields_27();
            break;
        case 28:
            ChipLogProgress(chipTool, " ***** Test Step 28 : Create user in the last slot\n");
            err = TestCreateUserInTheLastSlot_28();
            break;
        case 29:
            ChipLogProgress(chipTool, " ***** Test Step 29 : Read the last user back and verify its fields\n");
            err = TestReadTheLastUserBackAndVerifyItsFields_29();
            break;
        case 30:
            ChipLogProgress(chipTool, " ***** Test Step 30 : User creation in the 0 slot fails\n");
            err = TestUserCreationInThe0SlotFails_30();
            break;
        case 31:
            ChipLogProgress(chipTool, " ***** Test Step 31 : User creation in the out-of-bounds slot fails\n");
            err = TestUserCreationInTheOutOfBoundsSlotFails_31();
            break;
        case 32:
            ChipLogProgress(chipTool, " ***** Test Step 32 : Clear first user\n");
            err = TestClearFirstUser_32();
            break;
        case 33:
            ChipLogProgress(chipTool, " ***** Test Step 33 : Read cleared user and verify it is available\n");
            err = TestReadClearedUserAndVerifyItIsAvailable_33();
            break;
        case 34:
            ChipLogProgress(chipTool, " ***** Test Step 34 : Create new user in the cleared slot\n");
            err = TestCreateNewUserInTheClearedSlot_34();
            break;
        case 35:
            ChipLogProgress(chipTool, " ***** Test Step 35 : Read the user in the previously cleared slot and verify its fields\n");
            err = TestReadTheUserInThePreviouslyClearedSlotAndVerifyItsFields_35();
            break;
        case 36:
            ChipLogProgress(chipTool, " ***** Test Step 36 : Clear user with index 0 fails\n");
            err = TestClearUserWithIndex0Fails_36();
            break;
        case 37:
            ChipLogProgress(chipTool, " ***** Test Step 37 : Clear user with out-of-bounds index fails\n");
            err = TestClearUserWithOutOfBoundsIndexFails_37();
            break;
        case 38:
            ChipLogProgress(chipTool, " ***** Test Step 38 : Clear all users\n");
            err = TestClearAllUsers_38();
            break;
        case 39:
            ChipLogProgress(chipTool, " ***** Test Step 39 : Read first cleared user and verify it is available\n");
            err = TestReadFirstClearedUserAndVerifyItIsAvailable_39();
            break;
        case 40:
            ChipLogProgress(chipTool, " ***** Test Step 40 : Read last cleared user and verify it is available\n");
            err = TestReadLastClearedUserAndVerifyItIsAvailable_40();
            break;
        case 41:
            ChipLogProgress(chipTool, " ***** Test Step 41 : Get number of supported PIN credentials and verify default value\n");
            err = TestGetNumberOfSupportedPinCredentialsAndVerifyDefaultValue_41();
            break;
        case 42:
            ChipLogProgress(chipTool, " ***** Test Step 42 : Check that PIN credential does not exist\n");
            err = TestCheckThatPinCredentialDoesNotExist_42();
            break;
        case 43:
            ChipLogProgress(chipTool, " ***** Test Step 43 : Reading PIN credential with index 0 returns no credential\n");
            err = TestReadingPinCredentialWithIndex0ReturnsNoCredential_43();
            break;
        case 44:
            ChipLogProgress(
                chipTool, " ***** Test Step 44 : Reading PIN credential with out-of-bounds index returns no credential\n");
            err = TestReadingPinCredentialWithOutOfBoundsIndexReturnsNoCredential_44();
            break;
        case 45:
            ChipLogProgress(
                chipTool, " ***** Test Step 45 : Verify that a user with UserStatus = 0 cannot be added via SetCredential\n");
            err = TestVerifyThatAUserWithUserStatus0CannotBeAddedViaSetCredential_45();
            break;
        case 46:
            ChipLogProgress(
                chipTool, " ***** Test Step 46 : Verify that a user with UserStatus = 2 cannot be added via SetCredential\n");
            err = TestVerifyThatAUserWithUserStatus2CannotBeAddedViaSetCredential_46();
            break;
        case 47:
            ChipLogProgress(chipTool, " ***** Test Step 47 : Create new PIN credential and user\n");
            err = TestCreateNewPinCredentialAndUser_47();
            break;
        case 48:
            ChipLogProgress(chipTool, " ***** Test Step 48 : Verify created user\n");
            err = TestVerifyCreatedUser_48();
            break;
        case 49:
            ChipLogProgress(chipTool, " ***** Test Step 49 : Verify created PIN credential\n");
            err = TestVerifyCreatedPinCredential_49();
            break;
        case 50:
            ChipLogProgress(chipTool, " ***** Test Step 50 : Create new PIN credential and user with index 0 fails\n");
            err = TestCreateNewPinCredentialAndUserWithIndex0Fails_50();
            break;
        case 51:
            ChipLogProgress(chipTool, " ***** Test Step 51 : Create new PIN credential and user with out-of-bounds index fails\n");
            err = TestCreateNewPinCredentialAndUserWithOutOfBoundsIndexFails_51();
            break;
        case 52:
            ChipLogProgress(chipTool, " ***** Test Step 52 : Get number of supported RFID credentials and verify default value\n");
            err = TestGetNumberOfSupportedRfidCredentialsAndVerifyDefaultValue_52();
            break;
        case 53:
            ChipLogProgress(chipTool, " ***** Test Step 53 : Reading RFID credential with index 0 returns no credential\n");
            err = TestReadingRfidCredentialWithIndex0ReturnsNoCredential_53();
            break;
        case 54:
            ChipLogProgress(chipTool,
                " ***** Test Step 54 : Reading RFID credential with index 0 returns no credential duplicate with bug workaround\n");
            err = TestReadingRfidCredentialWithIndex0ReturnsNoCredentialDuplicateWithBugWorkaround_54();
            break;
        case 55:
            ChipLogProgress(
                chipTool, " ***** Test Step 55 : Reading RFID credential with out-of-bounds index returns no credential\n");
            err = TestReadingRfidCredentialWithOutOfBoundsIndexReturnsNoCredential_55();
            break;
        case 56:
            ChipLogProgress(chipTool, " ***** Test Step 56 : Check that RFID credential does not exist\n");
            err = TestCheckThatRfidCredentialDoesNotExist_56();
            break;
        case 57:
            ChipLogProgress(chipTool, " ***** Test Step 57 : Create new RFID credential and add it to existing user\n");
            err = TestCreateNewRfidCredentialAndAddItToExistingUser_57();
            break;
        case 58:
            ChipLogProgress(chipTool, " ***** Test Step 58 : Verify modified user\n");
            err = TestVerifyModifiedUser_58();
            break;
        case 59:
            ChipLogProgress(chipTool, " ***** Test Step 59 : Verify created credential\n");
            err = TestVerifyCreatedCredential_59();
            break;
        case 60:
            ChipLogProgress(chipTool, " ***** Test Step 60 : Create new RFID credential and user with index 0 fails\n");
            err = TestCreateNewRfidCredentialAndUserWithIndex0Fails_60();
            break;
        case 61:
            ChipLogProgress(chipTool, " ***** Test Step 61 : Create new RFID credential and user with out-of-bounds index fails\n");
            err = TestCreateNewRfidCredentialAndUserWithOutOfBoundsIndexFails_61();
            break;
        case 62:
            ChipLogProgress(chipTool, " ***** Test Step 62 : Create new credential and try to add it to 0 user\n");
            err = TestCreateNewCredentialAndTryToAddItTo0User_62();
            break;
        case 63:
            ChipLogProgress(chipTool, " ***** Test Step 63 : Create new credential and try to add it to out-of-bounds user\n");
            err = TestCreateNewCredentialAndTryToAddItToOutOfBoundsUser_63();
            break;
        case 64:
            ChipLogProgress(chipTool, " ***** Test Step 64 : Create new PIN with too short data\n");
            err = TestCreateNewPinWithTooShortData_64();
            break;
        case 65:
            ChipLogProgress(chipTool, " ***** Test Step 65 : Create new PIN with too long data\n");
            err = TestCreateNewPinWithTooLongData_65();
            break;
        case 66:
            ChipLogProgress(chipTool, " ***** Test Step 66 : Create new RFID with too short data\n");
            err = TestCreateNewRfidWithTooShortData_66();
            break;
        case 67:
            ChipLogProgress(chipTool, " ***** Test Step 67 : Create new PIN with Programming user type fails\n");
            err = TestCreateNewPinWithProgrammingUserTypeFails_67();
            break;
        case 68:
            ChipLogProgress(chipTool, " ***** Test Step 68 : Create new RFID with too short data\n");
            err = TestCreateNewRfidWithTooShortData_68();
            break;
        case 69:
            ChipLogProgress(chipTool, " ***** Test Step 69 : Create new PIN credential with data the would cause duplicate\n");
            err = TestCreateNewPinCredentialWithDataTheWouldCauseDuplicate_69();
            break;
        case 70:
            ChipLogProgress(chipTool, " ***** Test Step 70 : Create new RFID credential with data the would cause duplicate\n");
            err = TestCreateNewRfidCredentialWithDataTheWouldCauseDuplicate_70();
            break;
        case 71:
            ChipLogProgress(chipTool, " ***** Test Step 71 : Modify credentialData of existing PIN credential\n");
            err = TestModifyCredentialDataOfExistingPinCredential_71();
            break;
        case 72:
            ChipLogProgress(
                chipTool, " ***** Test Step 72 : Verify that credential was changed by creating new credential with old data\n");
            err = TestVerifyThatCredentialWasChangedByCreatingNewCredentialWithOldData_72();
            break;
        case 73:
            ChipLogProgress(
                chipTool, " ***** Test Step 73 : Verify that credential was changed by creating new credential with new data\n");
            err = TestVerifyThatCredentialWasChangedByCreatingNewCredentialWithNewData_73();
            break;
        case 74:
            ChipLogProgress(chipTool, " ***** Test Step 74 : Create new RFID credential and add it to existing user\n");
            err = TestCreateNewRfidCredentialAndAddItToExistingUser_74();
            break;
        case 75:
            ChipLogProgress(chipTool, " ***** Test Step 75 : Verify modified user\n");
            err = TestVerifyModifiedUser_75();
            break;
        case 76:
            ChipLogProgress(chipTool, " ***** Test Step 76 : Create new RFID credential and add it to existing user\n");
            err = TestCreateNewRfidCredentialAndAddItToExistingUser_76();
            break;
        case 77:
            ChipLogProgress(chipTool, " ***** Test Step 77 : Verify modified user\n");
            err = TestVerifyModifiedUser_77();
            break;
        case 78:
            ChipLogProgress(chipTool, " ***** Test Step 78 : Clear first PIN credential\n");
            err = TestClearFirstPinCredential_78();
            break;
        case 79:
            ChipLogProgress(chipTool, " ***** Test Step 79 : Read back the credential and make sure it is deleted\n");
            err = TestReadBackTheCredentialAndMakeSureItIsDeleted_79();
            break;
        case 80:
            ChipLogProgress(chipTool, " ***** Test Step 80 : Read the user back and make sure PIN credential is deleted\n");
            err = TestReadTheUserBackAndMakeSurePinCredentialIsDeleted_80();
            break;
        case 81:
            ChipLogProgress(chipTool, " ***** Test Step 81 : Clear the second PIN credential\n");
            err = TestClearTheSecondPinCredential_81();
            break;
        case 82:
            ChipLogProgress(chipTool, " ***** Test Step 82 : Read back the credential and make sure it is deleted\n");
            err = TestReadBackTheCredentialAndMakeSureItIsDeleted_82();
            break;
        case 83:
            ChipLogProgress(chipTool, " ***** Test Step 83 : Read the user back and make sure related user is deleted\n");
            err = TestReadTheUserBackAndMakeSureRelatedUserIsDeleted_83();
            break;
        case 84:
            ChipLogProgress(chipTool, " ***** Test Step 84 : Create new RFID credential with user\n");
            err = TestCreateNewRfidCredentialWithUser_84();
            break;
        case 85:
            ChipLogProgress(chipTool, " ***** Test Step 85 : Clear all the RFID credentials\n");
            err = TestClearAllTheRfidCredentials_85();
            break;
        case 86:
            ChipLogProgress(chipTool, " ***** Test Step 86 : Read back the fist RFID credential and make sure it is deleted\n");
            err = TestReadBackTheFistRfidCredentialAndMakeSureItIsDeleted_86();
            break;
        case 87:
            ChipLogProgress(chipTool, " ***** Test Step 87 : Read back the second RFID credential and make sure it is deleted\n");
            err = TestReadBackTheSecondRfidCredentialAndMakeSureItIsDeleted_87();
            break;
        case 88:
            ChipLogProgress(chipTool, " ***** Test Step 88 : Read back the third RFID credential and make sure it is deleted\n");
            err = TestReadBackTheThirdRfidCredentialAndMakeSureItIsDeleted_88();
            break;
        case 89:
            ChipLogProgress(chipTool,
                " ***** Test Step 89 : Read the user related with first RFID back and make sure it has only PIN credential\n");
            err = TestReadTheUserRelatedWithFirstRfidBackAndMakeSureItHasOnlyPinCredential_89();
            break;
        case 90:
            ChipLogProgress(
                chipTool, " ***** Test Step 90 : Read the user related with second RFID back and make sure it is deleted\n");
            err = TestReadTheUserRelatedWithSecondRfidBackAndMakeSureItIsDeleted_90();
            break;
        case 91:
            ChipLogProgress(chipTool, " ***** Test Step 91 : Create new PIN credential with user\n");
            err = TestCreateNewPinCredentialWithUser_91();
            break;
        case 92:
            ChipLogProgress(chipTool, " ***** Test Step 92 : Create new RFID credential with user\n");
            err = TestCreateNewRfidCredentialWithUser_92();
            break;
        case 93:
            ChipLogProgress(chipTool, " ***** Test Step 93 : Create another RFID credential with user\n");
            err = TestCreateAnotherRfidCredentialWithUser_93();
            break;
        case 94:
            ChipLogProgress(chipTool, " ***** Test Step 94 : Clear all the credentials\n");
            err = TestClearAllTheCredentials_94();
            break;
        case 95:
            ChipLogProgress(chipTool, " ***** Test Step 95 : Read back the first PIN credential and make sure it is deleted\n");
            err = TestReadBackTheFirstPinCredentialAndMakeSureItIsDeleted_95();
            break;
        case 96:
            ChipLogProgress(chipTool, " ***** Test Step 96 : Read back the first RFID credential and make sure it is deleted\n");
            err = TestReadBackTheFirstRfidCredentialAndMakeSureItIsDeleted_96();
            break;
        case 97:
            ChipLogProgress(chipTool, " ***** Test Step 97 : Read back the second PIN credential and make sure it is deleted\n");
            err = TestReadBackTheSecondPinCredentialAndMakeSureItIsDeleted_97();
            break;
        case 98:
            ChipLogProgress(
                chipTool, " ***** Test Step 98 : Read the user related with first PIN back and make sure it is deleted\n");
            err = TestReadTheUserRelatedWithFirstPinBackAndMakeSureItIsDeleted_98();
            break;
        case 99:
            ChipLogProgress(
                chipTool, " ***** Test Step 99 : Read the user related with first RFID back and make sure it is deleted\n");
            err = TestReadTheUserRelatedWithFirstRfidBackAndMakeSureItIsDeleted_99();
            break;
        case 100:
            ChipLogProgress(
                chipTool, " ***** Test Step 100 : Read the user related with second PIN back and make sure it is deleted\n");
            err = TestReadTheUserRelatedWithSecondPinBackAndMakeSureItIsDeleted_100();
            break;
        case 101:
            ChipLogProgress(
                chipTool, " ***** Test Step 101 : Read the user related with last RFID back and make sure it is deleted\n");
            err = TestReadTheUserRelatedWithLastRfidBackAndMakeSureItIsDeleted_101();
            break;
        case 102:
            ChipLogProgress(chipTool, " ***** Test Step 102 : Create new Programming PIN credential with invalid index\n");
            err = TestCreateNewProgrammingPinCredentialWithInvalidIndex_102();
            break;
        case 103:
            ChipLogProgress(chipTool, " ***** Test Step 103 : Create new Programming PIN credential with valid index\n");
            err = TestCreateNewProgrammingPinCredentialWithValidIndex_103();
            break;
        case 104:
            ChipLogProgress(chipTool, " ***** Test Step 104 : Verify created user\n");
            err = TestVerifyCreatedUser_104();
            break;
        case 105:
            ChipLogProgress(chipTool, " ***** Test Step 105 : Verify created programming PIN credential\n");
            err = TestVerifyCreatedProgrammingPinCredential_105();
            break;
        case 106:
            ChipLogProgress(chipTool, " ***** Test Step 106 : Modify the Programming PIN credential\n");
            err = TestModifyTheProgrammingPinCredential_106();
            break;
        case 107:
            ChipLogProgress(chipTool, " ***** Test Step 107 : Clearing Programming PIN fails\n");
            err = TestClearingProgrammingPinFails_107();
            break;
        case 108:
            ChipLogProgress(chipTool, " ***** Test Step 108 : Clearing Programming PIN with invalid index fails\n");
            err = TestClearingProgrammingPinWithInvalidIndexFails_108();
            break;
        case 109:
            ChipLogProgress(chipTool, " ***** Test Step 109 : Clearing PIN credential with zero index fails\n");
            err = TestClearingPinCredentialWithZeroIndexFails_109();
            break;
        case 110:
            ChipLogProgress(chipTool, " ***** Test Step 110 : Clearing PIN credential with out-of-bound index fails\n");
            err = TestClearingPinCredentialWithOutOfBoundIndexFails_110();
            break;
        case 111:
            ChipLogProgress(chipTool, " ***** Test Step 111 : Clearing RFID credential with zero index fails\n");
            err = TestClearingRfidCredentialWithZeroIndexFails_111();
            break;
        case 112:
            ChipLogProgress(chipTool, " ***** Test Step 112 : Clearing RFID credential with out-of-bound index fails\n");
            err = TestClearingRfidCredentialWithOutOfBoundIndexFails_112();
            break;
        case 113:
            ChipLogProgress(chipTool, " ***** Test Step 113 : Clear the Programming PIN user\n");
            err = TestClearTheProgrammingPinUser_113();
            break;
        case 114:
            ChipLogProgress(chipTool, " ***** Test Step 114 : Make sure Programming PIN user is deleted\n");
            err = TestMakeSureProgrammingPinUserIsDeleted_114();
            break;
        case 115:
            ChipLogProgress(chipTool, " ***** Test Step 115 : Make sure programming PIN credential is deleted\n");
            err = TestMakeSureProgrammingPinCredentialIsDeleted_115();
            break;
        case 116:
            ChipLogProgress(chipTool, " ***** Test Step 116 : Create new PIN credential and user\n");
            err = TestCreateNewPinCredentialAndUser_116();
            break;
        case 117:
            ChipLogProgress(chipTool, " ***** Test Step 117 : Create second PIN credential and add it to existing user\n");
            err = TestCreateSecondPinCredentialAndAddItToExistingUser_117();
            break;
        case 118:
            ChipLogProgress(chipTool, " ***** Test Step 118 : Create third PIN credential and add it to existing user\n");
            err = TestCreateThirdPinCredentialAndAddItToExistingUser_118();
            break;
        case 119:
            ChipLogProgress(chipTool, " ***** Test Step 119 : Create fourth PIN credential and add it to existing user\n");
            err = TestCreateFourthPinCredentialAndAddItToExistingUser_119();
            break;
        case 120:
            ChipLogProgress(chipTool, " ***** Test Step 120 : Create fifth PIN credential and add it to existing user\n");
            err = TestCreateFifthPinCredentialAndAddItToExistingUser_120();
            break;
        case 121:
            ChipLogProgress(chipTool, " ***** Test Step 121 : Try to create sixth PIN credential and make sure it fails\n");
            err = TestTryToCreateSixthPinCredentialAndMakeSureItFails_121();
            break;
        case 122:
            ChipLogProgress(chipTool, " ***** Test Step 122 : Final clean-up\n");
            err = TestFinalCleanUp_122();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), 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));
            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));
            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));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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));
            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));
            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));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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));
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 46:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 50:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 51:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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));
            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));
            break;
        case 58:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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));
            break;
        case 61:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 70:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 71:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 72:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 73:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 77:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 78:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 79:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 80:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 81:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 82:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 83:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 87:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 88:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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));
            break;
        case 91:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 92:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 93:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 94:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 95:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 96:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 101:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 102:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 103:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 104:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 105:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 106:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 107:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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), EMBER_ZCL_STATUS_INVALID_COMMAND));
            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));
            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));
            break;
        case 119:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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));
            break;
        case 122:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 123;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadAvailableUserSlotAndVerifyResponseFields_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read available user slot and verify response fields Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNull("UserName", actualValue));
                            }

                            {
                                id actualValue = values.userUniqueID;
                                VerifyOrReturn(CheckValueNull("UserUniqueID", actualValue));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNull("UserStatus", actualValue));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNull("UserType", actualValue));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNull("CredentialRule", actualValue));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("Credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNull("CreatorFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNull("LastModifiedFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("NextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull NumberOfTotalUsersSupported;

    CHIP_ERROR TestGetNumberOfSupportedUsersAndVerifyDefaultValue_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNumberOfTotalUsersSupportedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Get number of supported users and verify default value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("NumberOfTotalUsersSupported", actualValue, 10U));
            }
            {
                NumberOfTotalUsersSupported = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadFailsForUserWithIndex0_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:0U];
        [cluster
            getUserWithParams:params
                   completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                       NSLog(@"Read fails for user with index 0 Error: %@", err);

                       VerifyOrReturn(CheckValue("status",
                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE) : 0,
                           EMBER_ZCL_STATUS_INVALID_COMMAND));
                       NextTest();
                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadFailsForUserWithIndexGreaterThanNumberOfUsersSupported_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:[NumberOfTotalUsersSupported unsignedShortValue] + 1U];
        [cluster
            getUserWithParams:params
                   completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                       NSLog(@"Read fails for user with index greater than Number Of Users Supported Error: %@", err);

                       VerifyOrReturn(CheckValue("status",
                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE) : 0,
                           EMBER_ZCL_STATUS_INVALID_COMMAND));
                       NextTest();
                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewUserWithDefaultParameters_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userName = nil;
        params.userUniqueID = nil;
        params.userStatus = nil;
        params.userType = nil;
        params.credentialRule = nil;
        [cluster setUserWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"Create new user with default parameters Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheUserBackAndVerifyItsFields_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the user back and verify its fields Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNonNull("UserName", actualValue));
                                VerifyOrReturn(CheckValueAsString("UserName", actualValue, @""));
                            }

                            {
                                id actualValue = values.userUniqueID;
                                VerifyOrReturn(CheckValueNull("UserUniqueID", actualValue));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNonNull("UserStatus", actualValue));
                                VerifyOrReturn(CheckValue("UserStatus", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNonNull("UserType", actualValue));
                                VerifyOrReturn(CheckValue("UserType", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNonNull("CredentialRule", actualValue));
                                VerifyOrReturn(CheckValue("CredentialRule", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("Credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("CreatorFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("CreatorFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("LastModifiedFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("LastModifiedFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("NextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSetUserAtTheOccupiedIndexFailsWithAppropriateResponse_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userName = nil;
        params.userUniqueID = nil;
        params.userStatus = nil;
        params.userType = nil;
        params.credentialRule = nil;
        [cluster
            setUserWithParams:params
                   completion:^(NSError * _Nullable err) {
                       NSLog(@"Set user at the occupied index fails with appropriate response Error: %@", err);

                       VerifyOrReturn(CheckValue("status",
                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE) : 0,
                           EMBER_ZCL_STATUS_FAILURE));
                       NextTest();
                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestModifyUserNameForExistingUser_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:2U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userName = @"new_user";
        params.userUniqueID = nil;
        params.userStatus = nil;
        params.userType = nil;
        params.credentialRule = nil;
        [cluster setUserWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"Modify userName for existing user Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheModifiedUserBackAndVerifyItsFields_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the modified user back and verify its fields Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNonNull("UserName", actualValue));
                                VerifyOrReturn(CheckValueAsString("UserName", actualValue, @"new_user"));
                            }

                            {
                                id actualValue = values.userUniqueID;
                                VerifyOrReturn(CheckValueNull("UserUniqueID", actualValue));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNonNull("UserStatus", actualValue));
                                VerifyOrReturn(CheckValue("UserStatus", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNonNull("UserType", actualValue));
                                VerifyOrReturn(CheckValue("UserType", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNonNull("CredentialRule", actualValue));
                                VerifyOrReturn(CheckValue("CredentialRule", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("Credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("CreatorFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("CreatorFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("LastModifiedFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("LastModifiedFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("NextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestModifyUserUniqueIdForExistingUser_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:2U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userName = nil;
        params.userUniqueID = [NSNumber numberWithUnsignedInt:305441741UL];
        params.userStatus = nil;
        params.userType = nil;
        params.credentialRule = nil;
        [cluster setUserWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"Modify userUniqueId for existing user Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheModifiedUserBackAndVerifyItsFields_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the modified user back and verify its fields Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNonNull("UserName", actualValue));
                                VerifyOrReturn(CheckValueAsString("UserName", actualValue, @"new_user"));
                            }

                            {
                                id actualValue = values.userUniqueID;
                                VerifyOrReturn(CheckValueNonNull("UserUniqueID", actualValue));
                                VerifyOrReturn(CheckValue("UserUniqueID", actualValue, 305441741UL));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNonNull("UserStatus", actualValue));
                                VerifyOrReturn(CheckValue("UserStatus", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNonNull("UserType", actualValue));
                                VerifyOrReturn(CheckValue("UserType", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNonNull("CredentialRule", actualValue));
                                VerifyOrReturn(CheckValue("CredentialRule", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("Credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("CreatorFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("CreatorFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("LastModifiedFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("LastModifiedFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("NextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestModifyUserStatusForExistingUser_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:2U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userName = nil;
        params.userUniqueID = nil;
        params.userStatus = [NSNumber numberWithUnsignedChar:3U];
        params.userType = nil;
        params.credentialRule = nil;
        [cluster setUserWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"Modify userStatus for existing user Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheModifiedUserBackAndVerifyItsFields_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the modified user back and verify its fields Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNonNull("UserName", actualValue));
                                VerifyOrReturn(CheckValueAsString("UserName", actualValue, @"new_user"));
                            }

                            {
                                id actualValue = values.userUniqueID;
                                VerifyOrReturn(CheckValueNonNull("UserUniqueID", actualValue));
                                VerifyOrReturn(CheckValue("UserUniqueID", actualValue, 305441741UL));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNonNull("UserStatus", actualValue));
                                VerifyOrReturn(CheckValue("UserStatus", actualValue, 3U));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNonNull("UserType", actualValue));
                                VerifyOrReturn(CheckValue("UserType", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNonNull("CredentialRule", actualValue));
                                VerifyOrReturn(CheckValue("CredentialRule", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("Credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("CreatorFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("CreatorFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("LastModifiedFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("LastModifiedFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("NextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestModifyUserTypeForExistingUser_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:2U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userName = nil;
        params.userUniqueID = nil;
        params.userStatus = nil;
        params.userType = [NSNumber numberWithUnsignedChar:6U];
        params.credentialRule = nil;
        [cluster setUserWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"Modify userType for existing user Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheModifiedUserBackAndVerifyItsFields_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the modified user back and verify its fields Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNonNull("UserName", actualValue));
                                VerifyOrReturn(CheckValueAsString("UserName", actualValue, @"new_user"));
                            }

                            {
                                id actualValue = values.userUniqueID;
                                VerifyOrReturn(CheckValueNonNull("UserUniqueID", actualValue));
                                VerifyOrReturn(CheckValue("UserUniqueID", actualValue, 305441741UL));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNonNull("UserStatus", actualValue));
                                VerifyOrReturn(CheckValue("UserStatus", actualValue, 3U));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNonNull("UserType", actualValue));
                                VerifyOrReturn(CheckValue("UserType", actualValue, 6U));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNonNull("CredentialRule", actualValue));
                                VerifyOrReturn(CheckValue("CredentialRule", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("Credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("CreatorFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("CreatorFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("LastModifiedFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("LastModifiedFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("NextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestModifyCredentialRuleForExistingUser_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:2U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userName = nil;
        params.userUniqueID = nil;
        params.userStatus = nil;
        params.userType = nil;
        params.credentialRule = [NSNumber numberWithUnsignedChar:2U];
        [cluster setUserWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"Modify credentialRule for existing user Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheModifiedUserBackAndVerifyItsFields_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the modified user back and verify its fields Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNonNull("UserName", actualValue));
                                VerifyOrReturn(CheckValueAsString("UserName", actualValue, @"new_user"));
                            }

                            {
                                id actualValue = values.userUniqueID;
                                VerifyOrReturn(CheckValueNonNull("UserUniqueID", actualValue));
                                VerifyOrReturn(CheckValue("UserUniqueID", actualValue, 305441741UL));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNonNull("UserStatus", actualValue));
                                VerifyOrReturn(CheckValue("UserStatus", actualValue, 3U));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNonNull("UserType", actualValue));
                                VerifyOrReturn(CheckValue("UserType", actualValue, 6U));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNonNull("CredentialRule", actualValue));
                                VerifyOrReturn(CheckValue("CredentialRule", actualValue, 2U));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("Credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("CreatorFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("CreatorFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("LastModifiedFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("LastModifiedFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("NextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestModifyAllFieldsForExistingUser_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:2U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userName = @"test_user";
        params.userUniqueID = [NSNumber numberWithUnsignedInt:466460832UL];
        params.userStatus = [NSNumber numberWithUnsignedChar:1U];
        params.userType = [NSNumber numberWithUnsignedChar:0U];
        params.credentialRule = [NSNumber numberWithUnsignedChar:1U];
        [cluster setUserWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"Modify all fields for existing user Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheModifiedUserBackAndVerifyItsFields_19()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the modified user back and verify its fields Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNonNull("UserName", actualValue));
                                VerifyOrReturn(CheckValueAsString("UserName", actualValue, @"test_user"));
                            }

                            {
                                id actualValue = values.userUniqueID;
                                VerifyOrReturn(CheckValueNonNull("UserUniqueID", actualValue));
                                VerifyOrReturn(CheckValue("UserUniqueID", actualValue, 466460832UL));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNonNull("UserStatus", actualValue));
                                VerifyOrReturn(CheckValue("UserStatus", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNonNull("UserType", actualValue));
                                VerifyOrReturn(CheckValue("UserType", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNonNull("CredentialRule", actualValue));
                                VerifyOrReturn(CheckValue("CredentialRule", actualValue, 1U));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("Credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("CreatorFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("CreatorFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("LastModifiedFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("LastModifiedFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("NextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestAddAnotherUserWithNonDefaultFields_20()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:2U];
        params.userName = @"test_user2";
        params.userUniqueID = [NSNumber numberWithUnsignedInt:12648430UL];
        params.userStatus = [NSNumber numberWithUnsignedChar:1U];
        params.userType = [NSNumber numberWithUnsignedChar:1U];
        params.credentialRule = [NSNumber numberWithUnsignedChar:2U];
        [cluster setUserWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"Add another user with non-default fields Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheNewUserBackAndVerifyItsFields_21()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:2U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the new user back and verify its fields Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("UserIndex", actualValue, 2U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNonNull("UserName", actualValue));
                                VerifyOrReturn(CheckValueAsString("UserName", actualValue, @"test_user2"));
                            }

                            {
                                id actualValue = values.userUniqueID;
                                VerifyOrReturn(CheckValueNonNull("UserUniqueID", actualValue));
                                VerifyOrReturn(CheckValue("UserUniqueID", actualValue, 12648430UL));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNonNull("UserStatus", actualValue));
                                VerifyOrReturn(CheckValue("UserStatus", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNonNull("UserType", actualValue));
                                VerifyOrReturn(CheckValue("UserType", actualValue, 1U));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNonNull("CredentialRule", actualValue));
                                VerifyOrReturn(CheckValue("CredentialRule", actualValue, 2U));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("Credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("CreatorFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("CreatorFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("LastModifiedFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("LastModifiedFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("NextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTryToAddAUserWithUserStatus0_22()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:3U];
        params.userName = @"test_user3";
        params.userUniqueID = [NSNumber numberWithUnsignedInt:47802UL];
        params.userStatus = [NSNumber numberWithUnsignedChar:0U];
        params.userType = nil;
        params.credentialRule = nil;
        [cluster
            setUserWithParams:params
                   completion:^(NSError * _Nullable err) {
                       NSLog(@"Try to add a user with userStatus 0 Error: %@", err);

                       VerifyOrReturn(CheckValue("status",
                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE) : 0,
                           EMBER_ZCL_STATUS_INVALID_COMMAND));
                       NextTest();
                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureTheUserDidNotGetCreated_23()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:3U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Make sure the user did not get created Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("UserIndex", actualValue, 3U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNull("UserName", actualValue));
                            }

                            {
                                id actualValue = values.userUniqueID;
                                VerifyOrReturn(CheckValueNull("UserUniqueID", actualValue));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNull("UserStatus", actualValue));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNull("UserType", actualValue));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNull("CredentialRule", actualValue));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("Credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNull("CreatorFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNull("LastModifiedFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("NextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTryToAddAUserWithUserStatus2_24()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:3U];
        params.userName = @"test_user3";
        params.userUniqueID = [NSNumber numberWithUnsignedInt:47802UL];
        params.userStatus = [NSNumber numberWithUnsignedChar:2U];
        params.userType = nil;
        params.credentialRule = nil;
        [cluster
            setUserWithParams:params
                   completion:^(NSError * _Nullable err) {
                       NSLog(@"Try to add a user with userStatus 2 Error: %@", err);

                       VerifyOrReturn(CheckValue("status",
                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE) : 0,
                           EMBER_ZCL_STATUS_INVALID_COMMAND));
                       NextTest();
                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureTheUserDidNotGetCreated_25()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:3U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Make sure the user did not get created Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("UserIndex", actualValue, 3U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNull("UserName", actualValue));
                            }

                            {
                                id actualValue = values.userUniqueID;
                                VerifyOrReturn(CheckValueNull("UserUniqueID", actualValue));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNull("UserStatus", actualValue));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNull("UserType", actualValue));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNull("CredentialRule", actualValue));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("Credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNull("CreatorFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNull("LastModifiedFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("NextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTryToAddAUserWithUserStatus3_26()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:3U];
        params.userName = @"test_user3";
        params.userUniqueID = [NSNumber numberWithUnsignedInt:47802UL];
        params.userStatus = [NSNumber numberWithUnsignedChar:3U];
        params.userType = nil;
        params.credentialRule = nil;
        [cluster setUserWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"Try to add a user with userStatus 3 Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheNewThirdUserBackAndVerifyItsFields_27()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:3U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the new third user back and verify its fields Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("UserIndex", actualValue, 3U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNonNull("UserName", actualValue));
                                VerifyOrReturn(CheckValueAsString("UserName", actualValue, @"test_user3"));
                            }

                            {
                                id actualValue = values.userUniqueID;
                                VerifyOrReturn(CheckValueNonNull("UserUniqueID", actualValue));
                                VerifyOrReturn(CheckValue("UserUniqueID", actualValue, 47802UL));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNonNull("UserStatus", actualValue));
                                VerifyOrReturn(CheckValue("UserStatus", actualValue, 3U));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNonNull("UserType", actualValue));
                                VerifyOrReturn(CheckValue("UserType", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNonNull("CredentialRule", actualValue));
                                VerifyOrReturn(CheckValue("CredentialRule", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("Credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("CreatorFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("CreatorFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("LastModifiedFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("LastModifiedFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("NextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateUserInTheLastSlot_28()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NumberOfTotalUsersSupported copy];
        params.userName = @"last_user";
        params.userUniqueID = nil;
        params.userStatus = nil;
        params.userType = nil;
        params.credentialRule = nil;
        [cluster setUserWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"Create user in the last slot Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheLastUserBackAndVerifyItsFields_29()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NumberOfTotalUsersSupported copy];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the last user back and verify its fields Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("UserIndex", actualValue, NumberOfTotalUsersSupported));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNonNull("UserName", actualValue));
                                VerifyOrReturn(CheckValueAsString("UserName", actualValue, @"last_user"));
                            }

                            {
                                id actualValue = values.userUniqueID;
                                VerifyOrReturn(CheckValueNull("UserUniqueID", actualValue));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNonNull("UserStatus", actualValue));
                                VerifyOrReturn(CheckValue("UserStatus", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNonNull("UserType", actualValue));
                                VerifyOrReturn(CheckValue("UserType", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNonNull("CredentialRule", actualValue));
                                VerifyOrReturn(CheckValue("CredentialRule", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("Credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("CreatorFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("CreatorFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("LastModifiedFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("LastModifiedFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("NextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestUserCreationInThe0SlotFails_30()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:0U];
        params.userName = nil;
        params.userUniqueID = nil;
        params.userStatus = nil;
        params.userType = nil;
        params.credentialRule = nil;
        [cluster
            setUserWithParams:params
                   completion:^(NSError * _Nullable err) {
                       NSLog(@"User creation in the 0 slot fails Error: %@", err);

                       VerifyOrReturn(CheckValue("status",
                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE) : 0,
                           EMBER_ZCL_STATUS_INVALID_COMMAND));
                       NextTest();
                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestUserCreationInTheOutOfBoundsSlotFails_31()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:[NumberOfTotalUsersSupported unsignedShortValue] + 1U];
        params.userName = nil;
        params.userUniqueID = nil;
        params.userStatus = nil;
        params.userType = nil;
        params.credentialRule = nil;
        [cluster
            setUserWithParams:params
                   completion:^(NSError * _Nullable err) {
                       NSLog(@"User creation in the out-of-bounds slot fails Error: %@", err);

                       VerifyOrReturn(CheckValue("status",
                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE) : 0,
                           EMBER_ZCL_STATUS_INVALID_COMMAND));
                       NextTest();
                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearFirstUser_32()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster clearUserWithParams:params
                          completion:^(NSError * _Nullable err) {
                              NSLog(@"Clear first user Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadClearedUserAndVerifyItIsAvailable_33()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read cleared user and verify it is available Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNull("UserName", actualValue));
                            }

                            {
                                id actualValue = values.userUniqueID;
                                VerifyOrReturn(CheckValueNull("UserUniqueID", actualValue));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNull("UserStatus", actualValue));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNull("UserType", actualValue));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNull("CredentialRule", actualValue));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("Credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNull("CreatorFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNull("LastModifiedFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNonNull("NextUserIndex", actualValue));
                                VerifyOrReturn(CheckValue("NextUserIndex", actualValue, 2U));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewUserInTheClearedSlot_34()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userName = nil;
        params.userUniqueID = nil;
        params.userStatus = nil;
        params.userType = nil;
        params.credentialRule = nil;
        [cluster setUserWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"Create new user in the cleared slot Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheUserInThePreviouslyClearedSlotAndVerifyItsFields_35()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the user in the previously cleared slot and verify its fields Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNonNull("UserName", actualValue));
                                VerifyOrReturn(CheckValueAsString("UserName", actualValue, @""));
                            }

                            {
                                id actualValue = values.userUniqueID;
                                VerifyOrReturn(CheckValueNull("UserUniqueID", actualValue));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNonNull("UserStatus", actualValue));
                                VerifyOrReturn(CheckValue("UserStatus", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNonNull("UserType", actualValue));
                                VerifyOrReturn(CheckValue("UserType", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNonNull("CredentialRule", actualValue));
                                VerifyOrReturn(CheckValue("CredentialRule", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("Credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("CreatorFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("CreatorFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("LastModifiedFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("LastModifiedFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNonNull("NextUserIndex", actualValue));
                                VerifyOrReturn(CheckValue("NextUserIndex", actualValue, 2U));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearUserWithIndex0Fails_36()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:0U];
        [cluster
            clearUserWithParams:params
                     completion:^(NSError * _Nullable err) {
                         NSLog(@"Clear user with index 0 fails Error: %@", err);

                         VerifyOrReturn(CheckValue("status",
                             err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                 : 0,
                             EMBER_ZCL_STATUS_INVALID_COMMAND));
                         NextTest();
                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearUserWithOutOfBoundsIndexFails_37()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:[NumberOfTotalUsersSupported unsignedShortValue] + 1U];
        [cluster
            clearUserWithParams:params
                     completion:^(NSError * _Nullable err) {
                         NSLog(@"Clear user with out-of-bounds index fails Error: %@", err);

                         VerifyOrReturn(CheckValue("status",
                             err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                 : 0,
                             EMBER_ZCL_STATUS_INVALID_COMMAND));
                         NextTest();
                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearAllUsers_38()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:65534U];
        [cluster clearUserWithParams:params
                          completion:^(NSError * _Nullable err) {
                              NSLog(@"Clear all users Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadFirstClearedUserAndVerifyItIsAvailable_39()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:2U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read first cleared user and verify it is available Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("UserIndex", actualValue, 2U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNull("UserName", actualValue));
                            }

                            {
                                id actualValue = values.userUniqueID;
                                VerifyOrReturn(CheckValueNull("UserUniqueID", actualValue));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNull("UserStatus", actualValue));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNull("UserType", actualValue));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNull("CredentialRule", actualValue));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("Credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNull("CreatorFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNull("LastModifiedFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("NextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadLastClearedUserAndVerifyItIsAvailable_40()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NumberOfTotalUsersSupported copy];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read last cleared user and verify it is available Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("UserIndex", actualValue, NumberOfTotalUsersSupported));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNull("UserName", actualValue));
                            }

                            {
                                id actualValue = values.userUniqueID;
                                VerifyOrReturn(CheckValueNull("UserUniqueID", actualValue));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNull("UserStatus", actualValue));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNull("UserType", actualValue));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNull("CredentialRule", actualValue));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("Credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNull("CreatorFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNull("LastModifiedFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("NextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull NumberOfPINUsersSupported;

    CHIP_ERROR TestGetNumberOfSupportedPinCredentialsAndVerifyDefaultValue_41()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNumberOfPINUsersSupportedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Get number of supported PIN credentials and verify default value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("NumberOfPINUsersSupported", actualValue, 10U));
            }
            {
                NumberOfPINUsersSupported = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckThatPinCredentialDoesNotExist_42()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        [cluster getCredentialStatusWithParams:params
                                    completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                        NSError * _Nullable err) {
                                        NSLog(@"Check that PIN credential does not exist Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = values.credentialExists;
                                            VerifyOrReturn(CheckValue("CredentialExists", actualValue, false));
                                        }

                                        {
                                            id actualValue = values.userIndex;
                                            VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.creatorFabricIndex;
                                            VerifyOrReturn(CheckValueNull("CreatorFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.lastModifiedFabricIndex;
                                            VerifyOrReturn(CheckValueNull("LastModifiedFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.nextCredentialIndex;
                                            VerifyOrReturn(CheckValueNull("NextCredentialIndex", actualValue));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadingPinCredentialWithIndex0ReturnsNoCredential_43()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:0U];

        [cluster getCredentialStatusWithParams:params
                                    completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                        NSError * _Nullable err) {
                                        NSLog(@"Reading PIN credential with index 0 returns no credential Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = values.credentialExists;
                                            VerifyOrReturn(CheckValue("CredentialExists", actualValue, false));
                                        }

                                        {
                                            id actualValue = values.userIndex;
                                            VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.creatorFabricIndex;
                                            VerifyOrReturn(CheckValueNull("CreatorFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.lastModifiedFabricIndex;
                                            VerifyOrReturn(CheckValueNull("LastModifiedFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.nextCredentialIndex;
                                            VerifyOrReturn(CheckValueNull("NextCredentialIndex", actualValue));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadingPinCredentialWithOutOfBoundsIndexReturnsNoCredential_44()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex =
            [NSNumber numberWithUnsignedShort:[NumberOfPINUsersSupported unsignedShortValue] + 1U];

        [cluster
            getCredentialStatusWithParams:params
                               completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                   NSError * _Nullable err) {
                                   NSLog(@"Reading PIN credential with out-of-bounds index returns no credential Error: %@", err);

                                   VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                   {
                                       id actualValue = values.credentialExists;
                                       VerifyOrReturn(CheckValue("CredentialExists", actualValue, false));
                                   }

                                   {
                                       id actualValue = values.userIndex;
                                       VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                                   }

                                   {
                                       id actualValue = values.creatorFabricIndex;
                                       VerifyOrReturn(CheckValueNull("CreatorFabricIndex", actualValue));
                                   }

                                   {
                                       id actualValue = values.lastModifiedFabricIndex;
                                       VerifyOrReturn(CheckValueNull("LastModifiedFabricIndex", actualValue));
                                   }

                                   {
                                       id actualValue = values.nextCredentialIndex;
                                       VerifyOrReturn(CheckValueNull("NextCredentialIndex", actualValue));
                                   }

                                   NextTest();
                               }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatAUserWithUserStatus0CannotBeAddedViaSetCredential_45()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        params.credentialData = [[NSData alloc] initWithBytes:"000000" length:6];
        params.userIndex = nil;
        params.userStatus = [NSNumber numberWithUnsignedChar:0U];
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Verify that a user with UserStatus = 0 cannot be added via SetCredential Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 133U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("NextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("NextCredentialIndex", actualValue, 2U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatAUserWithUserStatus2CannotBeAddedViaSetCredential_46()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        params.credentialData = [[NSData alloc] initWithBytes:"000000" length:6];
        params.userIndex = nil;
        params.userStatus = [NSNumber numberWithUnsignedChar:2U];
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Verify that a user with UserStatus = 2 cannot be added via SetCredential Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 133U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("NextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("NextCredentialIndex", actualValue, 2U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewPinCredentialAndUser_47()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        params.credentialData = [[NSData alloc] initWithBytes:"000000" length:6];
        params.userIndex = nil;
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new PIN credential and user Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNonNull("UserIndex", actualValue));
                                 VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("NextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("NextCredentialIndex", actualValue, 2U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyCreatedUser_48()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Verify created user Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNonNull("UserName", actualValue));
                                VerifyOrReturn(CheckValueAsString("UserName", actualValue, @""));
                            }

                            {
                                id actualValue = values.userUniqueID;
                                VerifyOrReturn(CheckValueNull("UserUniqueID", actualValue));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNonNull("UserStatus", actualValue));
                                VerifyOrReturn(CheckValue("UserStatus", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNonNull("UserType", actualValue));
                                VerifyOrReturn(CheckValue("UserType", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNonNull("CredentialRule", actualValue));
                                VerifyOrReturn(CheckValue("CredentialRule", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNonNull("Credentials", actualValue));
                                VerifyOrReturn(CheckValue("Credentials", [actualValue count], static_cast<uint32_t>(1)));
                                VerifyOrReturn(CheckValue(
                                    "CredentialType", ((MTRDoorLockClusterCredentialStruct *) actualValue[0]).credentialType, 1U));
                                VerifyOrReturn(CheckValue("CredentialIndex",
                                    ((MTRDoorLockClusterCredentialStruct *) actualValue[0]).credentialIndex, 1U));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("CreatorFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("CreatorFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("LastModifiedFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("LastModifiedFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("NextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyCreatedPinCredential_49()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        [cluster getCredentialStatusWithParams:params
                                    completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                        NSError * _Nullable err) {
                                        NSLog(@"Verify created PIN credential Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = values.credentialExists;
                                            VerifyOrReturn(CheckValue("CredentialExists", actualValue, true));
                                        }

                                        {
                                            id actualValue = values.userIndex;
                                            VerifyOrReturn(CheckValueNonNull("UserIndex", actualValue));
                                            VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                                        }

                                        {
                                            id actualValue = values.creatorFabricIndex;
                                            VerifyOrReturn(CheckValueNonNull("CreatorFabricIndex", actualValue));
                                            VerifyOrReturn(CheckValue("CreatorFabricIndex", actualValue, 1U));
                                        }

                                        {
                                            id actualValue = values.lastModifiedFabricIndex;
                                            VerifyOrReturn(CheckValueNonNull("LastModifiedFabricIndex", actualValue));
                                            VerifyOrReturn(CheckValue("LastModifiedFabricIndex", actualValue, 1U));
                                        }

                                        {
                                            id actualValue = values.nextCredentialIndex;
                                            VerifyOrReturn(CheckValueNull("NextCredentialIndex", actualValue));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewPinCredentialAndUserWithIndex0Fails_50()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:0U];

        params.credentialData = [[NSData alloc] initWithBytes:"123456" length:6];
        params.userIndex = nil;
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new PIN credential and user with index 0 fails Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 133U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("NextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("NextCredentialIndex", actualValue, 2U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewPinCredentialAndUserWithOutOfBoundsIndexFails_51()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex =
            [NSNumber numberWithUnsignedShort:[NumberOfPINUsersSupported unsignedShortValue] + 1U];

        params.credentialData = [[NSData alloc] initWithBytes:"123456" length:6];
        params.userIndex = nil;
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new PIN credential and user with out-of-bounds index fails Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 133U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNull("NextCredentialIndex", actualValue));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull NumberOfRFIDUsersSupported;

    CHIP_ERROR TestGetNumberOfSupportedRfidCredentialsAndVerifyDefaultValue_52()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNumberOfRFIDUsersSupportedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Get number of supported RFID credentials and verify default value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("NumberOfRFIDUsersSupported", actualValue, 10U));
            }
            {
                NumberOfRFIDUsersSupported = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadingRfidCredentialWithIndex0ReturnsNoCredential_53()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:0U];

        [cluster getCredentialStatusWithParams:params
                                    completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                        NSError * _Nullable err) {
                                        NSLog(@"Reading RFID credential with index 0 returns no credential Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = values.credentialExists;
                                            VerifyOrReturn(CheckValue("CredentialExists", actualValue, false));
                                        }

                                        {
                                            id actualValue = values.userIndex;
                                            VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.creatorFabricIndex;
                                            VerifyOrReturn(CheckValueNull("CreatorFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.lastModifiedFabricIndex;
                                            VerifyOrReturn(CheckValueNull("LastModifiedFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.nextCredentialIndex;
                                            VerifyOrReturn(CheckValueNull("NextCredentialIndex", actualValue));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadingRfidCredentialWithIndex0ReturnsNoCredentialDuplicateWithBugWorkaround_54()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:0U];

        [cluster getCredentialStatusWithParams:params
                                    completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                        NSError * _Nullable err) {
                                        NSLog(@"Reading RFID credential with index 0 returns no credential duplicate with bug "
                                              @"workaround Error: %@",
                                            err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = values.credentialExists;
                                            VerifyOrReturn(CheckValue("CredentialExists", actualValue, false));
                                        }

                                        {
                                            id actualValue = values.userIndex;
                                            VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.creatorFabricIndex;
                                            VerifyOrReturn(CheckValueNull("CreatorFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.lastModifiedFabricIndex;
                                            VerifyOrReturn(CheckValueNull("LastModifiedFabricIndex", actualValue));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadingRfidCredentialWithOutOfBoundsIndexReturnsNoCredential_55()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex =
            [NSNumber numberWithUnsignedShort:[NumberOfRFIDUsersSupported unsignedShortValue] + 1U];

        [cluster
            getCredentialStatusWithParams:params
                               completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                   NSError * _Nullable err) {
                                   NSLog(@"Reading RFID credential with out-of-bounds index returns no credential Error: %@", err);

                                   VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                   {
                                       id actualValue = values.credentialExists;
                                       VerifyOrReturn(CheckValue("CredentialExists", actualValue, false));
                                   }

                                   {
                                       id actualValue = values.userIndex;
                                       VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                                   }

                                   {
                                       id actualValue = values.creatorFabricIndex;
                                       VerifyOrReturn(CheckValueNull("CreatorFabricIndex", actualValue));
                                   }

                                   {
                                       id actualValue = values.lastModifiedFabricIndex;
                                       VerifyOrReturn(CheckValueNull("LastModifiedFabricIndex", actualValue));
                                   }

                                   {
                                       id actualValue = values.nextCredentialIndex;
                                       VerifyOrReturn(CheckValueNull("NextCredentialIndex", actualValue));
                                   }

                                   NextTest();
                               }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckThatRfidCredentialDoesNotExist_56()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:2U];

        [cluster getCredentialStatusWithParams:params
                                    completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                        NSError * _Nullable err) {
                                        NSLog(@"Check that RFID credential does not exist Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = values.credentialExists;
                                            VerifyOrReturn(CheckValue("CredentialExists", actualValue, false));
                                        }

                                        {
                                            id actualValue = values.userIndex;
                                            VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.creatorFabricIndex;
                                            VerifyOrReturn(CheckValueNull("CreatorFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.lastModifiedFabricIndex;
                                            VerifyOrReturn(CheckValueNull("LastModifiedFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.nextCredentialIndex;
                                            VerifyOrReturn(CheckValueNull("NextCredentialIndex", actualValue));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewRfidCredentialAndAddItToExistingUser_57()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        params.credentialData = [[NSData alloc] initWithBytes:"rfid_data_123456" length:16];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new RFID credential and add it to existing user Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("NextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("NextCredentialIndex", actualValue, 2U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyModifiedUser_58()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Verify modified user Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNonNull("UserName", actualValue));
                                VerifyOrReturn(CheckValueAsString("UserName", actualValue, @""));
                            }

                            {
                                id actualValue = values.userUniqueID;
                                VerifyOrReturn(CheckValueNull("UserUniqueID", actualValue));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNonNull("UserStatus", actualValue));
                                VerifyOrReturn(CheckValue("UserStatus", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNonNull("UserType", actualValue));
                                VerifyOrReturn(CheckValue("UserType", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNonNull("CredentialRule", actualValue));
                                VerifyOrReturn(CheckValue("CredentialRule", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNonNull("Credentials", actualValue));
                                VerifyOrReturn(CheckValue("Credentials", [actualValue count], static_cast<uint32_t>(2)));
                                VerifyOrReturn(CheckValue(
                                    "CredentialType", ((MTRDoorLockClusterCredentialStruct *) actualValue[0]).credentialType, 1U));
                                VerifyOrReturn(CheckValue("CredentialIndex",
                                    ((MTRDoorLockClusterCredentialStruct *) actualValue[0]).credentialIndex, 1U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialType", ((MTRDoorLockClusterCredentialStruct *) actualValue[1]).credentialType, 2U));
                                VerifyOrReturn(CheckValue("CredentialIndex",
                                    ((MTRDoorLockClusterCredentialStruct *) actualValue[1]).credentialIndex, 1U));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("CreatorFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("CreatorFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("LastModifiedFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("LastModifiedFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("NextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyCreatedCredential_59()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        [cluster getCredentialStatusWithParams:params
                                    completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                        NSError * _Nullable err) {
                                        NSLog(@"Verify created credential Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = values.credentialExists;
                                            VerifyOrReturn(CheckValue("CredentialExists", actualValue, true));
                                        }

                                        {
                                            id actualValue = values.userIndex;
                                            VerifyOrReturn(CheckValueNonNull("UserIndex", actualValue));
                                            VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                                        }

                                        {
                                            id actualValue = values.creatorFabricIndex;
                                            VerifyOrReturn(CheckValueNonNull("CreatorFabricIndex", actualValue));
                                            VerifyOrReturn(CheckValue("CreatorFabricIndex", actualValue, 1U));
                                        }

                                        {
                                            id actualValue = values.lastModifiedFabricIndex;
                                            VerifyOrReturn(CheckValueNonNull("LastModifiedFabricIndex", actualValue));
                                            VerifyOrReturn(CheckValue("LastModifiedFabricIndex", actualValue, 1U));
                                        }

                                        {
                                            id actualValue = values.nextCredentialIndex;
                                            VerifyOrReturn(CheckValueNull("NextCredentialIndex", actualValue));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewRfidCredentialAndUserWithIndex0Fails_60()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:0U];

        params.credentialData = [[NSData alloc] initWithBytes:"new_rfid_data_field" length:19];
        params.userIndex = nil;
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new RFID credential and user with index 0 fails Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 133U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("NextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("NextCredentialIndex", actualValue, 2U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewRfidCredentialAndUserWithOutOfBoundsIndexFails_61()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex =
            [NSNumber numberWithUnsignedShort:[NumberOfRFIDUsersSupported unsignedShortValue] + 1U];

        params.credentialData = [[NSData alloc] initWithBytes:"new_rfid_data_field" length:19];
        params.userIndex = nil;
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new RFID credential and user with out-of-bounds index fails Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 133U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNull("NextCredentialIndex", actualValue));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewCredentialAndTryToAddItTo0User_62()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:2U];

        params.credentialData = [[NSData alloc] initWithBytes:"123465" length:6];
        params.userIndex = [NSNumber numberWithUnsignedShort:0U];
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new credential and try to add it to 0 user Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 133U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("NextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("NextCredentialIndex", actualValue, 3U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewCredentialAndTryToAddItToOutOfBoundsUser_63()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:2U];

        params.credentialData = [[NSData alloc] initWithBytes:"123465" length:6];
        params.userIndex = [NSNumber numberWithUnsignedShort:[NumberOfTotalUsersSupported unsignedShortValue] + 1U];
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new credential and try to add it to out-of-bounds user Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 133U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("NextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("NextCredentialIndex", actualValue, 3U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewPinWithTooShortData_64()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:2U];

        params.credentialData = [[NSData alloc] initWithBytes:"12345" length:5];
        params.userIndex = [NSNumber numberWithUnsignedShort:0U];
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new PIN with too short data Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 133U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("NextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("NextCredentialIndex", actualValue, 3U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewPinWithTooLongData_65()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:2U];

        params.credentialData = [[NSData alloc] initWithBytes:"123456789" length:9];
        params.userIndex = [NSNumber numberWithUnsignedShort:0U];
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new PIN with too long data Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 133U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("NextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("NextCredentialIndex", actualValue, 3U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewRfidWithTooShortData_66()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:2U];

        params.credentialData = [[NSData alloc] initWithBytes:"rfid_data" length:9];
        params.userIndex = [NSNumber numberWithUnsignedShort:0U];
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new RFID with too short data Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 133U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("NextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("NextCredentialIndex", actualValue, 3U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewPinWithProgrammingUserTypeFails_67()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:2U];

        params.credentialData = [[NSData alloc] initWithBytes:"123456" length:6];
        params.userIndex = [NSNumber numberWithUnsignedShort:0U];
        params.userStatus = nil;
        params.userType = [NSNumber numberWithUnsignedChar:3U];
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new PIN with Programming user type fails Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 133U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("NextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("NextCredentialIndex", actualValue, 3U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewRfidWithTooShortData_68()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:2U];

        params.credentialData = [[NSData alloc] initWithBytes:"very_long_rfid_data_to_test_boundaries" length:38];
        params.userIndex = [NSNumber numberWithUnsignedShort:0U];
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new RFID with too short data Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 133U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("NextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("NextCredentialIndex", actualValue, 3U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewPinCredentialWithDataTheWouldCauseDuplicate_69()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:3U];

        params.credentialData = [[NSData alloc] initWithBytes:"000000" length:6];
        params.userIndex = nil;
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new PIN credential with data the would cause duplicate Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 2U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("NextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("NextCredentialIndex", actualValue, 4U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewRfidCredentialWithDataTheWouldCauseDuplicate_70()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:2U];

        params.credentialData = [[NSData alloc] initWithBytes:"rfid_data_123456" length:16];
        params.userIndex = nil;
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new RFID credential with data the would cause duplicate Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 2U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("NextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("NextCredentialIndex", actualValue, 3U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestModifyCredentialDataOfExistingPinCredential_71()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:2U];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        params.credentialData = [[NSData alloc] initWithBytes:"123456" length:6];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Modify credentialData of existing PIN credential Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("NextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("NextCredentialIndex", actualValue, 2U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatCredentialWasChangedByCreatingNewCredentialWithOldData_72()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:2U];

        params.credentialData = [[NSData alloc] initWithBytes:"000000" length:6];
        params.userIndex = nil;
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Verify that credential was changed by creating new credential with old data Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNonNull("UserIndex", actualValue));
                                 VerifyOrReturn(CheckValue("UserIndex", actualValue, 2U));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("NextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("NextCredentialIndex", actualValue, 3U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatCredentialWasChangedByCreatingNewCredentialWithNewData_73()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:3U];

        params.credentialData = [[NSData alloc] initWithBytes:"123456" length:6];
        params.userIndex = nil;
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Verify that credential was changed by creating new credential with new data Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 2U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("NextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("NextCredentialIndex", actualValue, 4U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewRfidCredentialAndAddItToExistingUser_74()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:2U];

        params.credentialData = [[NSData alloc] initWithBytes:"rfid_data_7890" length:14];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new RFID credential and add it to existing user Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("NextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("NextCredentialIndex", actualValue, 3U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyModifiedUser_75()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Verify modified user Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNonNull("UserName", actualValue));
                                VerifyOrReturn(CheckValueAsString("UserName", actualValue, @""));
                            }

                            {
                                id actualValue = values.userUniqueID;
                                VerifyOrReturn(CheckValueNull("UserUniqueID", actualValue));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNonNull("UserStatus", actualValue));
                                VerifyOrReturn(CheckValue("UserStatus", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNonNull("UserType", actualValue));
                                VerifyOrReturn(CheckValue("UserType", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNonNull("CredentialRule", actualValue));
                                VerifyOrReturn(CheckValue("CredentialRule", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNonNull("Credentials", actualValue));
                                VerifyOrReturn(CheckValue("Credentials", [actualValue count], static_cast<uint32_t>(3)));
                                VerifyOrReturn(CheckValue(
                                    "CredentialType", ((MTRDoorLockClusterCredentialStruct *) actualValue[0]).credentialType, 1U));
                                VerifyOrReturn(CheckValue("CredentialIndex",
                                    ((MTRDoorLockClusterCredentialStruct *) actualValue[0]).credentialIndex, 1U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialType", ((MTRDoorLockClusterCredentialStruct *) actualValue[1]).credentialType, 2U));
                                VerifyOrReturn(CheckValue("CredentialIndex",
                                    ((MTRDoorLockClusterCredentialStruct *) actualValue[1]).credentialIndex, 1U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialType", ((MTRDoorLockClusterCredentialStruct *) actualValue[2]).credentialType, 2U));
                                VerifyOrReturn(CheckValue("CredentialIndex",
                                    ((MTRDoorLockClusterCredentialStruct *) actualValue[2]).credentialIndex, 2U));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("CreatorFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("CreatorFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("LastModifiedFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("LastModifiedFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNonNull("NextUserIndex", actualValue));
                                VerifyOrReturn(CheckValue("NextUserIndex", actualValue, 2U));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewRfidCredentialAndAddItToExistingUser_76()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:3U];

        params.credentialData = [[NSData alloc] initWithBytes:"789012" length:6];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new RFID credential and add it to existing user Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("NextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("NextCredentialIndex", actualValue, 4U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyModifiedUser_77()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Verify modified user Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNonNull("UserName", actualValue));
                                VerifyOrReturn(CheckValueAsString("UserName", actualValue, @""));
                            }

                            {
                                id actualValue = values.userUniqueID;
                                VerifyOrReturn(CheckValueNull("UserUniqueID", actualValue));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNonNull("UserStatus", actualValue));
                                VerifyOrReturn(CheckValue("UserStatus", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNonNull("UserType", actualValue));
                                VerifyOrReturn(CheckValue("UserType", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNonNull("CredentialRule", actualValue));
                                VerifyOrReturn(CheckValue("CredentialRule", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNonNull("Credentials", actualValue));
                                VerifyOrReturn(CheckValue("Credentials", [actualValue count], static_cast<uint32_t>(4)));
                                VerifyOrReturn(CheckValue(
                                    "CredentialType", ((MTRDoorLockClusterCredentialStruct *) actualValue[0]).credentialType, 1U));
                                VerifyOrReturn(CheckValue("CredentialIndex",
                                    ((MTRDoorLockClusterCredentialStruct *) actualValue[0]).credentialIndex, 1U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialType", ((MTRDoorLockClusterCredentialStruct *) actualValue[1]).credentialType, 2U));
                                VerifyOrReturn(CheckValue("CredentialIndex",
                                    ((MTRDoorLockClusterCredentialStruct *) actualValue[1]).credentialIndex, 1U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialType", ((MTRDoorLockClusterCredentialStruct *) actualValue[2]).credentialType, 2U));
                                VerifyOrReturn(CheckValue("CredentialIndex",
                                    ((MTRDoorLockClusterCredentialStruct *) actualValue[2]).credentialIndex, 2U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialType", ((MTRDoorLockClusterCredentialStruct *) actualValue[3]).credentialType, 1U));
                                VerifyOrReturn(CheckValue("CredentialIndex",
                                    ((MTRDoorLockClusterCredentialStruct *) actualValue[3]).credentialIndex, 3U));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("CreatorFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("CreatorFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("LastModifiedFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("LastModifiedFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNonNull("NextUserIndex", actualValue));
                                VerifyOrReturn(CheckValue("NextUserIndex", actualValue, 2U));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearFirstPinCredential_78()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        [cluster clearCredentialWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clear first PIN credential Error: %@", err);

                                    VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackTheCredentialAndMakeSureItIsDeleted_79()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        [cluster getCredentialStatusWithParams:params
                                    completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                        NSError * _Nullable err) {
                                        NSLog(@"Read back the credential and make sure it is deleted Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = values.credentialExists;
                                            VerifyOrReturn(CheckValue("CredentialExists", actualValue, false));
                                        }

                                        {
                                            id actualValue = values.userIndex;
                                            VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.creatorFabricIndex;
                                            VerifyOrReturn(CheckValueNull("CreatorFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.lastModifiedFabricIndex;
                                            VerifyOrReturn(CheckValueNull("LastModifiedFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.nextCredentialIndex;
                                            VerifyOrReturn(CheckValueNonNull("NextCredentialIndex", actualValue));
                                            VerifyOrReturn(CheckValue("NextCredentialIndex", actualValue, 2U));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheUserBackAndMakeSurePinCredentialIsDeleted_80()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the user back and make sure PIN credential is deleted Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNonNull("UserName", actualValue));
                                VerifyOrReturn(CheckValueAsString("UserName", actualValue, @""));
                            }

                            {
                                id actualValue = values.userUniqueID;
                                VerifyOrReturn(CheckValueNull("UserUniqueID", actualValue));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNonNull("UserStatus", actualValue));
                                VerifyOrReturn(CheckValue("UserStatus", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNonNull("UserType", actualValue));
                                VerifyOrReturn(CheckValue("UserType", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNonNull("CredentialRule", actualValue));
                                VerifyOrReturn(CheckValue("CredentialRule", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNonNull("Credentials", actualValue));
                                VerifyOrReturn(CheckValue("Credentials", [actualValue count], static_cast<uint32_t>(3)));
                                VerifyOrReturn(CheckValue(
                                    "CredentialType", ((MTRDoorLockClusterCredentialStruct *) actualValue[0]).credentialType, 2U));
                                VerifyOrReturn(CheckValue("CredentialIndex",
                                    ((MTRDoorLockClusterCredentialStruct *) actualValue[0]).credentialIndex, 1U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialType", ((MTRDoorLockClusterCredentialStruct *) actualValue[1]).credentialType, 2U));
                                VerifyOrReturn(CheckValue("CredentialIndex",
                                    ((MTRDoorLockClusterCredentialStruct *) actualValue[1]).credentialIndex, 2U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialType", ((MTRDoorLockClusterCredentialStruct *) actualValue[2]).credentialType, 1U));
                                VerifyOrReturn(CheckValue("CredentialIndex",
                                    ((MTRDoorLockClusterCredentialStruct *) actualValue[2]).credentialIndex, 3U));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("CreatorFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("CreatorFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("LastModifiedFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("LastModifiedFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNonNull("NextUserIndex", actualValue));
                                VerifyOrReturn(CheckValue("NextUserIndex", actualValue, 2U));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearTheSecondPinCredential_81()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:2U];

        [cluster clearCredentialWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clear the second PIN credential Error: %@", err);

                                    VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackTheCredentialAndMakeSureItIsDeleted_82()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:2U];

        [cluster getCredentialStatusWithParams:params
                                    completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                        NSError * _Nullable err) {
                                        NSLog(@"Read back the credential and make sure it is deleted Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = values.credentialExists;
                                            VerifyOrReturn(CheckValue("CredentialExists", actualValue, false));
                                        }

                                        {
                                            id actualValue = values.userIndex;
                                            VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.creatorFabricIndex;
                                            VerifyOrReturn(CheckValueNull("CreatorFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.lastModifiedFabricIndex;
                                            VerifyOrReturn(CheckValueNull("LastModifiedFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.nextCredentialIndex;
                                            VerifyOrReturn(CheckValueNonNull("NextCredentialIndex", actualValue));
                                            VerifyOrReturn(CheckValue("NextCredentialIndex", actualValue, 3U));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheUserBackAndMakeSureRelatedUserIsDeleted_83()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:2U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the user back and make sure related user is deleted Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("UserIndex", actualValue, 2U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNull("UserName", actualValue));
                            }

                            {
                                id actualValue = values.userUniqueID;
                                VerifyOrReturn(CheckValueNull("UserUniqueID", actualValue));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNull("UserStatus", actualValue));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNull("UserType", actualValue));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNull("CredentialRule", actualValue));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("Credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNull("CreatorFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNull("LastModifiedFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("NextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewRfidCredentialWithUser_84()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:3U];

        params.credentialData = [[NSData alloc] initWithBytes:"rfid_data_12345" length:15];
        params.userIndex = nil;
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new RFID credential with user Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNonNull("UserIndex", actualValue));
                                 VerifyOrReturn(CheckValue("UserIndex", actualValue, 2U));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("NextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("NextCredentialIndex", actualValue, 4U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearAllTheRfidCredentials_85()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:65534U];

        [cluster clearCredentialWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clear all the RFID credentials Error: %@", err);

                                    VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackTheFistRfidCredentialAndMakeSureItIsDeleted_86()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        [cluster getCredentialStatusWithParams:params
                                    completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                        NSError * _Nullable err) {
                                        NSLog(@"Read back the fist RFID credential and make sure it is deleted Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = values.credentialExists;
                                            VerifyOrReturn(CheckValue("CredentialExists", actualValue, false));
                                        }

                                        {
                                            id actualValue = values.userIndex;
                                            VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.creatorFabricIndex;
                                            VerifyOrReturn(CheckValueNull("CreatorFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.lastModifiedFabricIndex;
                                            VerifyOrReturn(CheckValueNull("LastModifiedFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.nextCredentialIndex;
                                            VerifyOrReturn(CheckValueNull("NextCredentialIndex", actualValue));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackTheSecondRfidCredentialAndMakeSureItIsDeleted_87()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:2U];

        [cluster getCredentialStatusWithParams:params
                                    completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                        NSError * _Nullable err) {
                                        NSLog(@"Read back the second RFID credential and make sure it is deleted Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = values.credentialExists;
                                            VerifyOrReturn(CheckValue("CredentialExists", actualValue, false));
                                        }

                                        {
                                            id actualValue = values.userIndex;
                                            VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.creatorFabricIndex;
                                            VerifyOrReturn(CheckValueNull("CreatorFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.lastModifiedFabricIndex;
                                            VerifyOrReturn(CheckValueNull("LastModifiedFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.nextCredentialIndex;
                                            VerifyOrReturn(CheckValueNull("NextCredentialIndex", actualValue));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackTheThirdRfidCredentialAndMakeSureItIsDeleted_88()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:3U];

        [cluster getCredentialStatusWithParams:params
                                    completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                        NSError * _Nullable err) {
                                        NSLog(@"Read back the third RFID credential and make sure it is deleted Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = values.credentialExists;
                                            VerifyOrReturn(CheckValue("CredentialExists", actualValue, false));
                                        }

                                        {
                                            id actualValue = values.userIndex;
                                            VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.creatorFabricIndex;
                                            VerifyOrReturn(CheckValueNull("CreatorFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.lastModifiedFabricIndex;
                                            VerifyOrReturn(CheckValueNull("LastModifiedFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.nextCredentialIndex;
                                            VerifyOrReturn(CheckValueNull("NextCredentialIndex", actualValue));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheUserRelatedWithFirstRfidBackAndMakeSureItHasOnlyPinCredential_89()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster
            getUserWithParams:params
                   completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                       NSLog(@"Read the user related with first RFID back and make sure it has only PIN credential Error: %@", err);

                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                       {
                           id actualValue = values.userIndex;
                           VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                       }

                       {
                           id actualValue = values.userName;
                           VerifyOrReturn(CheckValueNonNull("UserName", actualValue));
                           VerifyOrReturn(CheckValueAsString("UserName", actualValue, @""));
                       }

                       {
                           id actualValue = values.userUniqueID;
                           VerifyOrReturn(CheckValueNull("UserUniqueID", actualValue));
                       }

                       {
                           id actualValue = values.userStatus;
                           VerifyOrReturn(CheckValueNonNull("UserStatus", actualValue));
                           VerifyOrReturn(CheckValue("UserStatus", actualValue, 1U));
                       }

                       {
                           id actualValue = values.userType;
                           VerifyOrReturn(CheckValueNonNull("UserType", actualValue));
                           VerifyOrReturn(CheckValue("UserType", actualValue, 0U));
                       }

                       {
                           id actualValue = values.credentialRule;
                           VerifyOrReturn(CheckValueNonNull("CredentialRule", actualValue));
                           VerifyOrReturn(CheckValue("CredentialRule", actualValue, 0U));
                       }

                       {
                           id actualValue = values.credentials;
                           VerifyOrReturn(CheckValueNonNull("Credentials", actualValue));
                           VerifyOrReturn(CheckValue("Credentials", [actualValue count], static_cast<uint32_t>(1)));
                           VerifyOrReturn(CheckValue(
                               "CredentialType", ((MTRDoorLockClusterCredentialStruct *) actualValue[0]).credentialType, 1U));
                           VerifyOrReturn(CheckValue(
                               "CredentialIndex", ((MTRDoorLockClusterCredentialStruct *) actualValue[0]).credentialIndex, 3U));
                       }

                       {
                           id actualValue = values.creatorFabricIndex;
                           VerifyOrReturn(CheckValueNonNull("CreatorFabricIndex", actualValue));
                           VerifyOrReturn(CheckValue("CreatorFabricIndex", actualValue, 1U));
                       }

                       {
                           id actualValue = values.lastModifiedFabricIndex;
                           VerifyOrReturn(CheckValueNonNull("LastModifiedFabricIndex", actualValue));
                           VerifyOrReturn(CheckValue("LastModifiedFabricIndex", actualValue, 1U));
                       }

                       {
                           id actualValue = values.nextUserIndex;
                           VerifyOrReturn(CheckValueNull("NextUserIndex", actualValue));
                       }

                       NextTest();
                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheUserRelatedWithSecondRfidBackAndMakeSureItIsDeleted_90()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:2U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the user related with second RFID back and make sure it is deleted Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("UserIndex", actualValue, 2U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNull("UserName", actualValue));
                            }

                            {
                                id actualValue = values.userUniqueID;
                                VerifyOrReturn(CheckValueNull("UserUniqueID", actualValue));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNull("UserStatus", actualValue));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNull("UserType", actualValue));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNull("CredentialRule", actualValue));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("Credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNull("CreatorFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNull("LastModifiedFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("NextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewPinCredentialWithUser_91()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        params.credentialData = [[NSData alloc] initWithBytes:"123456" length:6];
        params.userIndex = nil;
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new PIN credential with user Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNonNull("UserIndex", actualValue));
                                 VerifyOrReturn(CheckValue("UserIndex", actualValue, 2U));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("NextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("NextCredentialIndex", actualValue, 2U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewRfidCredentialWithUser_92()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:2U];

        params.credentialData = [[NSData alloc] initWithBytes:"rfid_data_1234" length:14];
        params.userIndex = nil;
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new RFID credential with user Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNonNull("UserIndex", actualValue));
                                 VerifyOrReturn(CheckValue("UserIndex", actualValue, 3U));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("NextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("NextCredentialIndex", actualValue, 3U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateAnotherRfidCredentialWithUser_93()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:6U];

        params.credentialData = [[NSData alloc] initWithBytes:"rfid_data_9876" length:14];
        params.userIndex = nil;
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create another RFID credential with user Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNonNull("UserIndex", actualValue));
                                 VerifyOrReturn(CheckValue("UserIndex", actualValue, 4U));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("NextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("NextCredentialIndex", actualValue, 7U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearAllTheCredentials_94()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
        params.credential = nil;
        [cluster clearCredentialWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clear all the credentials Error: %@", err);

                                    VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackTheFirstPinCredentialAndMakeSureItIsDeleted_95()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        [cluster getCredentialStatusWithParams:params
                                    completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                        NSError * _Nullable err) {
                                        NSLog(@"Read back the first PIN credential and make sure it is deleted Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = values.credentialExists;
                                            VerifyOrReturn(CheckValue("CredentialExists", actualValue, false));
                                        }

                                        {
                                            id actualValue = values.userIndex;
                                            VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.creatorFabricIndex;
                                            VerifyOrReturn(CheckValueNull("CreatorFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.lastModifiedFabricIndex;
                                            VerifyOrReturn(CheckValueNull("LastModifiedFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.nextCredentialIndex;
                                            VerifyOrReturn(CheckValueNull("NextCredentialIndex", actualValue));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackTheFirstRfidCredentialAndMakeSureItIsDeleted_96()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:2U];

        [cluster getCredentialStatusWithParams:params
                                    completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                        NSError * _Nullable err) {
                                        NSLog(@"Read back the first RFID credential and make sure it is deleted Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = values.credentialExists;
                                            VerifyOrReturn(CheckValue("CredentialExists", actualValue, false));
                                        }

                                        {
                                            id actualValue = values.userIndex;
                                            VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.creatorFabricIndex;
                                            VerifyOrReturn(CheckValueNull("CreatorFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.lastModifiedFabricIndex;
                                            VerifyOrReturn(CheckValueNull("LastModifiedFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.nextCredentialIndex;
                                            VerifyOrReturn(CheckValueNull("NextCredentialIndex", actualValue));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackTheSecondPinCredentialAndMakeSureItIsDeleted_97()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:6U];

        [cluster getCredentialStatusWithParams:params
                                    completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                        NSError * _Nullable err) {
                                        NSLog(@"Read back the second PIN credential and make sure it is deleted Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = values.credentialExists;
                                            VerifyOrReturn(CheckValue("CredentialExists", actualValue, false));
                                        }

                                        {
                                            id actualValue = values.userIndex;
                                            VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.creatorFabricIndex;
                                            VerifyOrReturn(CheckValueNull("CreatorFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.lastModifiedFabricIndex;
                                            VerifyOrReturn(CheckValueNull("LastModifiedFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.nextCredentialIndex;
                                            VerifyOrReturn(CheckValueNull("NextCredentialIndex", actualValue));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheUserRelatedWithFirstPinBackAndMakeSureItIsDeleted_98()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the user related with first PIN back and make sure it is deleted Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNull("UserName", actualValue));
                            }

                            {
                                id actualValue = values.userUniqueID;
                                VerifyOrReturn(CheckValueNull("UserUniqueID", actualValue));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNull("UserStatus", actualValue));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNull("UserType", actualValue));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNull("CredentialRule", actualValue));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("Credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNull("CreatorFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNull("LastModifiedFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("NextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheUserRelatedWithFirstRfidBackAndMakeSureItIsDeleted_99()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:2U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the user related with first RFID back and make sure it is deleted Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("UserIndex", actualValue, 2U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNull("UserName", actualValue));
                            }

                            {
                                id actualValue = values.userUniqueID;
                                VerifyOrReturn(CheckValueNull("UserUniqueID", actualValue));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNull("UserStatus", actualValue));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNull("UserType", actualValue));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNull("CredentialRule", actualValue));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("Credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNull("CreatorFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNull("LastModifiedFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("NextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheUserRelatedWithSecondPinBackAndMakeSureItIsDeleted_100()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:3U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the user related with second PIN back and make sure it is deleted Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("UserIndex", actualValue, 3U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNull("UserName", actualValue));
                            }

                            {
                                id actualValue = values.userUniqueID;
                                VerifyOrReturn(CheckValueNull("UserUniqueID", actualValue));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNull("UserStatus", actualValue));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNull("UserType", actualValue));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNull("CredentialRule", actualValue));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("Credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNull("CreatorFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNull("LastModifiedFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("NextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheUserRelatedWithLastRfidBackAndMakeSureItIsDeleted_101()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:4U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the user related with last RFID back and make sure it is deleted Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("UserIndex", actualValue, 4U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNull("UserName", actualValue));
                            }

                            {
                                id actualValue = values.userUniqueID;
                                VerifyOrReturn(CheckValueNull("UserUniqueID", actualValue));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNull("UserStatus", actualValue));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNull("UserType", actualValue));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNull("CredentialRule", actualValue));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("Credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNull("CreatorFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNull("LastModifiedFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("NextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewProgrammingPinCredentialWithInvalidIndex_102()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:0U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        params.credentialData = [[NSData alloc] initWithBytes:"123456" length:6];
        params.userIndex = nil;
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new Programming PIN credential with invalid index Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 133U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNull("NextCredentialIndex", actualValue));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewProgrammingPinCredentialWithValidIndex_103()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:0U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:0U];

        params.credentialData = [[NSData alloc] initWithBytes:"123456" length:6];
        params.userIndex = nil;
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new Programming PIN credential with valid index Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNonNull("UserIndex", actualValue));
                                 VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNull("NextCredentialIndex", actualValue));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyCreatedUser_104()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Verify created user Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNonNull("UserName", actualValue));
                                VerifyOrReturn(CheckValueAsString("UserName", actualValue, @""));
                            }

                            {
                                id actualValue = values.userUniqueID;
                                VerifyOrReturn(CheckValueNull("UserUniqueID", actualValue));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNonNull("UserStatus", actualValue));
                                VerifyOrReturn(CheckValue("UserStatus", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNonNull("UserType", actualValue));
                                VerifyOrReturn(CheckValue("UserType", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNonNull("CredentialRule", actualValue));
                                VerifyOrReturn(CheckValue("CredentialRule", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNonNull("Credentials", actualValue));
                                VerifyOrReturn(CheckValue("Credentials", [actualValue count], static_cast<uint32_t>(1)));
                                VerifyOrReturn(CheckValue(
                                    "CredentialType", ((MTRDoorLockClusterCredentialStruct *) actualValue[0]).credentialType, 0U));
                                VerifyOrReturn(CheckValue("CredentialIndex",
                                    ((MTRDoorLockClusterCredentialStruct *) actualValue[0]).credentialIndex, 0U));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("CreatorFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("CreatorFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("LastModifiedFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("LastModifiedFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("NextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyCreatedProgrammingPinCredential_105()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:0U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:0U];

        [cluster getCredentialStatusWithParams:params
                                    completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                        NSError * _Nullable err) {
                                        NSLog(@"Verify created programming PIN credential Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = values.credentialExists;
                                            VerifyOrReturn(CheckValue("CredentialExists", actualValue, true));
                                        }

                                        {
                                            id actualValue = values.userIndex;
                                            VerifyOrReturn(CheckValueNonNull("UserIndex", actualValue));
                                            VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                                        }

                                        {
                                            id actualValue = values.creatorFabricIndex;
                                            VerifyOrReturn(CheckValueNonNull("CreatorFabricIndex", actualValue));
                                            VerifyOrReturn(CheckValue("CreatorFabricIndex", actualValue, 1U));
                                        }

                                        {
                                            id actualValue = values.lastModifiedFabricIndex;
                                            VerifyOrReturn(CheckValueNonNull("LastModifiedFabricIndex", actualValue));
                                            VerifyOrReturn(CheckValue("LastModifiedFabricIndex", actualValue, 1U));
                                        }

                                        {
                                            id actualValue = values.nextCredentialIndex;
                                            VerifyOrReturn(CheckValueNull("NextCredentialIndex", actualValue));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestModifyTheProgrammingPinCredential_106()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:2U];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:0U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:0U];

        params.credentialData = [[NSData alloc] initWithBytes:"654321" length:6];
        params.userIndex = nil;
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Modify the Programming PIN credential Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNull("NextCredentialIndex", actualValue));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearingProgrammingPinFails_107()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:0U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:0U];

        [cluster clearCredentialWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clearing Programming PIN fails Error: %@", err);

                                    VerifyOrReturn(CheckValue("status",
                                        err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                      : EMBER_ZCL_STATUS_FAILURE)
                                            : 0,
                                        EMBER_ZCL_STATUS_INVALID_COMMAND));
                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearingProgrammingPinWithInvalidIndexFails_108()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:0U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        [cluster clearCredentialWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clearing Programming PIN with invalid index fails Error: %@", err);

                                    VerifyOrReturn(CheckValue("status",
                                        err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                      : EMBER_ZCL_STATUS_FAILURE)
                                            : 0,
                                        EMBER_ZCL_STATUS_INVALID_COMMAND));
                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearingPinCredentialWithZeroIndexFails_109()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:0U];

        [cluster clearCredentialWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clearing PIN credential with zero index fails Error: %@", err);

                                    VerifyOrReturn(CheckValue("status",
                                        err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                      : EMBER_ZCL_STATUS_FAILURE)
                                            : 0,
                                        EMBER_ZCL_STATUS_INVALID_COMMAND));
                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearingPinCredentialWithOutOfBoundIndexFails_110()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex =
            [NSNumber numberWithUnsignedShort:[NumberOfPINUsersSupported unsignedShortValue] + 1U];

        [cluster clearCredentialWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clearing PIN credential with out-of-bound index fails Error: %@", err);

                                    VerifyOrReturn(CheckValue("status",
                                        err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                      : EMBER_ZCL_STATUS_FAILURE)
                                            : 0,
                                        EMBER_ZCL_STATUS_INVALID_COMMAND));
                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearingRfidCredentialWithZeroIndexFails_111()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:0U];

        [cluster clearCredentialWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clearing RFID credential with zero index fails Error: %@", err);

                                    VerifyOrReturn(CheckValue("status",
                                        err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                      : EMBER_ZCL_STATUS_FAILURE)
                                            : 0,
                                        EMBER_ZCL_STATUS_INVALID_COMMAND));
                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearingRfidCredentialWithOutOfBoundIndexFails_112()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex =
            [NSNumber numberWithUnsignedShort:[NumberOfRFIDUsersSupported unsignedShortValue] + 1U];

        [cluster clearCredentialWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clearing RFID credential with out-of-bound index fails Error: %@", err);

                                    VerifyOrReturn(CheckValue("status",
                                        err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                      : EMBER_ZCL_STATUS_FAILURE)
                                            : 0,
                                        EMBER_ZCL_STATUS_INVALID_COMMAND));
                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearTheProgrammingPinUser_113()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster clearUserWithParams:params
                          completion:^(NSError * _Nullable err) {
                              NSLog(@"Clear the Programming PIN user Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureProgrammingPinUserIsDeleted_114()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Make sure Programming PIN user is deleted Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNull("UserName", actualValue));
                            }

                            {
                                id actualValue = values.userUniqueID;
                                VerifyOrReturn(CheckValueNull("UserUniqueID", actualValue));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNull("UserStatus", actualValue));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNull("UserType", actualValue));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNull("CredentialRule", actualValue));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("Credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNull("CreatorFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNull("LastModifiedFabricIndex", actualValue));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("NextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureProgrammingPinCredentialIsDeleted_115()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:0U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:0U];

        [cluster getCredentialStatusWithParams:params
                                    completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                        NSError * _Nullable err) {
                                        NSLog(@"Make sure programming PIN credential is deleted Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = values.credentialExists;
                                            VerifyOrReturn(CheckValue("CredentialExists", actualValue, false));
                                        }

                                        {
                                            id actualValue = values.userIndex;
                                            VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.creatorFabricIndex;
                                            VerifyOrReturn(CheckValueNull("CreatorFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.lastModifiedFabricIndex;
                                            VerifyOrReturn(CheckValueNull("LastModifiedFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.nextCredentialIndex;
                                            VerifyOrReturn(CheckValueNull("NextCredentialIndex", actualValue));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewPinCredentialAndUser_116()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        params.credentialData = [[NSData alloc] initWithBytes:"000000" length:6];
        params.userIndex = nil;
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new PIN credential and user Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNonNull("UserIndex", actualValue));
                                 VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("NextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("NextCredentialIndex", actualValue, 2U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateSecondPinCredentialAndAddItToExistingUser_117()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:2U];

        params.credentialData = [[NSData alloc] initWithBytes:"000001" length:6];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create second PIN credential and add it to existing user Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("NextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("NextCredentialIndex", actualValue, 3U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateThirdPinCredentialAndAddItToExistingUser_118()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:3U];

        params.credentialData = [[NSData alloc] initWithBytes:"000002" length:6];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create third PIN credential and add it to existing user Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("NextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("NextCredentialIndex", actualValue, 4U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateFourthPinCredentialAndAddItToExistingUser_119()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:4U];

        params.credentialData = [[NSData alloc] initWithBytes:"000003" length:6];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create fourth PIN credential and add it to existing user Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("NextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("NextCredentialIndex", actualValue, 5U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateFifthPinCredentialAndAddItToExistingUser_120()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:5U];

        params.credentialData = [[NSData alloc] initWithBytes:"000004" length:6];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create fifth PIN credential and add it to existing user Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("NextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("NextCredentialIndex", actualValue, 6U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTryToCreateSixthPinCredentialAndMakeSureItFails_121()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:6U];

        params.credentialData = [[NSData alloc] initWithBytes:"000005" length:6];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Try to create sixth PIN credential and make sure it fails Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 137U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("NextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("NextCredentialIndex", actualValue, 7U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestFinalCleanUp_122()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster clearUserWithParams:params
                          completion:^(NSError * _Nullable err) {
                              NSLog(@"Final clean-up Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }
};

class DL_LockUnlock : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    DL_LockUnlock()
        : TestCommandBridge("DL_LockUnlock")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~DL_LockUnlock() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: DL_LockUnlock\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: DL_LockUnlock\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Try to unlock the door without PIN\n");
            err = TestTryToUnlockTheDoorWithoutPin_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Verify that lock state attribute value is set to Unlocked\n");
            err = TestVerifyThatLockStateAttributeValueIsSetToUnlocked_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Try to lock the door without a PIN\n");
            err = TestTryToLockTheDoorWithoutAPin_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Verify that lock state attribute value is set to Locked\n");
            err = TestVerifyThatLockStateAttributeValueIsSetToLocked_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Create new PIN credential and lock/unlock user\n");
            err = TestCreateNewPinCredentialAndLockUnlockUser_5();
            break;
        case 6:
            ChipLogProgress(chipTool,
                " ***** Test Step 6 : Set the WrongCodeEntryLimit to big value so that we can test incorrect PIN entry\n");
            err = TestSetTheWrongCodeEntryLimitToBigValueSoThatWeCanTestIncorrectPinEntry_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Try to unlock the door with invalid PIN\n");
            err = TestTryToUnlockTheDoorWithInvalidPin_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Verify that lock state attribute value is set to Locked\n");
            err = TestVerifyThatLockStateAttributeValueIsSetToLocked_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Try to unlock the door with valid PIN\n");
            err = TestTryToUnlockTheDoorWithValidPin_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Verify that lock state attribute value is set to Unlocked\n");
            err = TestVerifyThatLockStateAttributeValueIsSetToUnlocked_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Try to lock the door with invalid PIN\n");
            err = TestTryToLockTheDoorWithInvalidPin_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Verify that lock state attribute value is set to Unlocked\n");
            err = TestVerifyThatLockStateAttributeValueIsSetToUnlocked_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Try to lock the door with valid PIN\n");
            err = TestTryToLockTheDoorWithValidPin_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Verify that lock state attribute value is set to Locked\n");
            err = TestVerifyThatLockStateAttributeValueIsSetToLocked_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Set OperatingMode to NoRemoteLockUnlock\n");
            err = TestSetOperatingModeToNoRemoteLockUnlock_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Try to unlock the door when OperatingMode is NoRemoteLockUnlock\n");
            err = TestTryToUnlockTheDoorWhenOperatingModeIsNoRemoteLockUnlock_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Set OperatingMode to Normal\n");
            err = TestSetOperatingModeToNormal_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Read the lockout timeout\n");
            err = TestReadTheLockoutTimeout_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Set the WrongCodeEntryLimit to small value so we can test lockout\n");
            err = TestSetTheWrongCodeEntryLimitToSmallValueSoWeCanTestLockout_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Try to unlock the door with invalid PIN for the first time\n");
            err = TestTryToUnlockTheDoorWithInvalidPinForTheFirstTime_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Try to unlock the door with invalid PIN for the second time\n");
            err = TestTryToUnlockTheDoorWithInvalidPinForTheSecondTime_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : Try to unlock the door with invalid PIN for the third time\n");
            err = TestTryToUnlockTheDoorWithInvalidPinForTheThirdTime_22();
            break;
        case 23:
            ChipLogProgress(
                chipTool, " ***** Test Step 23 : Try to unlock the door with valid PIN and make sure it fails due to lockout\n");
            err = TestTryToUnlockTheDoorWithValidPinAndMakeSureItFailsDueToLockout_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : Wait for the lockout to end\n");
            err = TestWaitForTheLockoutToEnd_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : Try to unlock the door with valid PIN and make sure it succeeds\n");
            err = TestTryToUnlockTheDoorWithValidPinAndMakeSureItSucceeds_25();
            break;
        case 26:
            ChipLogProgress(chipTool, " ***** Test Step 26 : Verify that lock state attribute value is set to Unlocked\n");
            err = TestVerifyThatLockStateAttributeValueIsSetToUnlocked_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : Lock the door back prior to next tests\n");
            err = TestLockTheDoorBackPriorToNextTests_27();
            break;
        case 28:
            ChipLogProgress(chipTool, " ***** Test Step 28 : Create a disabled user and credential\n");
            err = TestCreateADisabledUserAndCredential_28();
            break;
        case 29:
            ChipLogProgress(chipTool, " ***** Test Step 29 : Try to unlock the door with disabled user PIN\n");
            err = TestTryToUnlockTheDoorWithDisabledUserPin_29();
            break;
        case 30:
            ChipLogProgress(chipTool, " ***** Test Step 30 : Verify that lock state attribute value is set to Locked\n");
            err = TestVerifyThatLockStateAttributeValueIsSetToLocked_30();
            break;
        case 31:
            ChipLogProgress(chipTool, " ***** Test Step 31 : Unlock the door with enabled user PIN\n");
            err = TestUnlockTheDoorWithEnabledUserPin_31();
            break;
        case 32:
            ChipLogProgress(chipTool, " ***** Test Step 32 : Verify that lock state attribute value is set to Unlocked\n");
            err = TestVerifyThatLockStateAttributeValueIsSetToUnlocked_32();
            break;
        case 33:
            ChipLogProgress(chipTool, " ***** Test Step 33 : Try to lock the door with disabled user PIN\n");
            err = TestTryToLockTheDoorWithDisabledUserPin_33();
            break;
        case 34:
            ChipLogProgress(chipTool, " ***** Test Step 34 : Verify that lock state attribute value stays Unlocked\n");
            err = TestVerifyThatLockStateAttributeValueStaysUnlocked_34();
            break;
        case 35:
            ChipLogProgress(chipTool, " ***** Test Step 35 : Lock the door with enabled user PIN\n");
            err = TestLockTheDoorWithEnabledUserPin_35();
            break;
        case 36:
            ChipLogProgress(chipTool, " ***** Test Step 36 : Verify that lock state attribute value is set to Locked\n");
            err = TestVerifyThatLockStateAttributeValueIsSetToLocked_36();
            break;
        case 37:
            ChipLogProgress(chipTool, " ***** Test Step 37 : Clean all the users and credentials\n");
            err = TestCleanAllTheUsersAndCredentials_37();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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_FAILURE));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            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));
            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));
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 38;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestTryToUnlockTheDoorWithoutPin_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
        [cluster unlockDoorWithParams:params
                           completion:^(NSError * _Nullable err) {
                               NSLog(@"Try to unlock the door without PIN Error: %@", err);

                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                               NextTest();
                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatLockStateAttributeValueIsSetToUnlocked_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLockStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify that lock state attribute value is set to Unlocked Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("LockState", actualValue));
                VerifyOrReturn(CheckValue("LockState", actualValue, 2U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTryToLockTheDoorWithoutAPin_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterLockDoorParams alloc] init];
        [cluster lockDoorWithParams:params
                         completion:^(NSError * _Nullable err) {
                             NSLog(@"Try to lock the door without a PIN Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatLockStateAttributeValueIsSetToLocked_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLockStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify that lock state attribute value is set to Locked Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("LockState", actualValue));
                VerifyOrReturn(CheckValue("LockState", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewPinCredentialAndLockUnlockUser_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        params.credentialData = [[NSData alloc] initWithBytes:"123456" length:6];
        params.userIndex = nil;
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new PIN credential and lock/unlock user Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNonNull("UserIndex", actualValue));
                                 VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("NextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("NextCredentialIndex", actualValue, 2U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSetTheWrongCodeEntryLimitToBigValueSoThatWeCanTestIncorrectPinEntry_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id wrongCodeEntryLimitArgument;
        wrongCodeEntryLimitArgument = [NSNumber numberWithUnsignedChar:20U];
        [cluster writeAttributeWrongCodeEntryLimitWithValue:wrongCodeEntryLimitArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"Set the WrongCodeEntryLimit to big value so that we can test "
                                                           @"incorrect PIN entry Error: %@",
                                                         err);

                                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTryToUnlockTheDoorWithInvalidPin_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"000000" length:6];
        [cluster
            unlockDoorWithParams:params
                      completion:^(NSError * _Nullable err) {
                          NSLog(@"Try to unlock the door with invalid PIN Error: %@", err);

                          VerifyOrReturn(CheckValue("status",
                              err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                  : 0,
                              EMBER_ZCL_STATUS_FAILURE));
                          NextTest();
                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatLockStateAttributeValueIsSetToLocked_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLockStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify that lock state attribute value is set to Locked Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("LockState", actualValue));
                VerifyOrReturn(CheckValue("LockState", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTryToUnlockTheDoorWithValidPin_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"123456" length:6];
        [cluster unlockDoorWithParams:params
                           completion:^(NSError * _Nullable err) {
                               NSLog(@"Try to unlock the door with valid PIN Error: %@", err);

                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                               NextTest();
                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatLockStateAttributeValueIsSetToUnlocked_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLockStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify that lock state attribute value is set to Unlocked Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("LockState", actualValue));
                VerifyOrReturn(CheckValue("LockState", actualValue, 2U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTryToLockTheDoorWithInvalidPin_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterLockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"000000" length:6];
        [cluster
            lockDoorWithParams:params
                    completion:^(NSError * _Nullable err) {
                        NSLog(@"Try to lock the door with invalid PIN Error: %@", err);

                        VerifyOrReturn(CheckValue("status",
                            err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                : 0,
                            EMBER_ZCL_STATUS_FAILURE));
                        NextTest();
                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatLockStateAttributeValueIsSetToUnlocked_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLockStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify that lock state attribute value is set to Unlocked Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("LockState", actualValue));
                VerifyOrReturn(CheckValue("LockState", actualValue, 2U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTryToLockTheDoorWithValidPin_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterLockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"123456" length:6];
        [cluster lockDoorWithParams:params
                         completion:^(NSError * _Nullable err) {
                             NSLog(@"Try to lock the door with valid PIN Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatLockStateAttributeValueIsSetToLocked_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLockStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify that lock state attribute value is set to Locked Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("LockState", actualValue));
                VerifyOrReturn(CheckValue("LockState", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSetOperatingModeToNoRemoteLockUnlock_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id operatingModeArgument;
        operatingModeArgument = [NSNumber numberWithUnsignedChar:3U];
        [cluster writeAttributeOperatingModeWithValue:operatingModeArgument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"Set OperatingMode to NoRemoteLockUnlock Error: %@", err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTryToUnlockTheDoorWhenOperatingModeIsNoRemoteLockUnlock_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
        [cluster
            unlockDoorWithParams:params
                      completion:^(NSError * _Nullable err) {
                          NSLog(@"Try to unlock the door when OperatingMode is NoRemoteLockUnlock Error: %@", err);

                          VerifyOrReturn(CheckValue("status",
                              err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                  : 0,
                              EMBER_ZCL_STATUS_FAILURE));
                          NextTest();
                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSetOperatingModeToNormal_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id operatingModeArgument;
        operatingModeArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOperatingModeWithValue:operatingModeArgument
                                           completion:^(NSError * _Nullable err) {
                                               NSLog(@"Set OperatingMode to Normal Error: %@", err);

                                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheLockoutTimeout_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeUserCodeTemporaryDisableTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the lockout timeout Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("UserCodeTemporaryDisableTime", actualValue, 10U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSetTheWrongCodeEntryLimitToSmallValueSoWeCanTestLockout_19()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id wrongCodeEntryLimitArgument;
        wrongCodeEntryLimitArgument = [NSNumber numberWithUnsignedChar:3U];
        [cluster
            writeAttributeWrongCodeEntryLimitWithValue:wrongCodeEntryLimitArgument
                                            completion:^(NSError * _Nullable err) {
                                                NSLog(
                                                    @"Set the WrongCodeEntryLimit to small value so we can test lockout Error: %@",
                                                    err);

                                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                NextTest();
                                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTryToUnlockTheDoorWithInvalidPinForTheFirstTime_20()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"000000" length:6];
        [cluster
            unlockDoorWithParams:params
                      completion:^(NSError * _Nullable err) {
                          NSLog(@"Try to unlock the door with invalid PIN for the first time Error: %@", err);

                          VerifyOrReturn(CheckValue("status",
                              err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                  : 0,
                              EMBER_ZCL_STATUS_FAILURE));
                          NextTest();
                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTryToUnlockTheDoorWithInvalidPinForTheSecondTime_21()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"000000" length:6];
        [cluster
            unlockDoorWithParams:params
                      completion:^(NSError * _Nullable err) {
                          NSLog(@"Try to unlock the door with invalid PIN for the second time Error: %@", err);

                          VerifyOrReturn(CheckValue("status",
                              err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                  : 0,
                              EMBER_ZCL_STATUS_FAILURE));
                          NextTest();
                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTryToUnlockTheDoorWithInvalidPinForTheThirdTime_22()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"000000" length:6];
        [cluster
            unlockDoorWithParams:params
                      completion:^(NSError * _Nullable err) {
                          NSLog(@"Try to unlock the door with invalid PIN for the third time Error: %@", err);

                          VerifyOrReturn(CheckValue("status",
                              err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                  : 0,
                              EMBER_ZCL_STATUS_FAILURE));
                          NextTest();
                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTryToUnlockTheDoorWithValidPinAndMakeSureItFailsDueToLockout_23()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"123456" length:6];
        [cluster
            unlockDoorWithParams:params
                      completion:^(NSError * _Nullable err) {
                          NSLog(@"Try to unlock the door with valid PIN and make sure it fails due to lockout Error: %@", err);

                          VerifyOrReturn(CheckValue("status",
                              err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                  : 0,
                              EMBER_ZCL_STATUS_FAILURE));
                          NextTest();
                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWaitForTheLockoutToEnd_24()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestTryToUnlockTheDoorWithValidPinAndMakeSureItSucceeds_25()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"123456" length:6];
        [cluster unlockDoorWithParams:params
                           completion:^(NSError * _Nullable err) {
                               NSLog(@"Try to unlock the door with valid PIN and make sure it succeeds Error: %@", err);

                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                               NextTest();
                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatLockStateAttributeValueIsSetToUnlocked_26()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLockStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify that lock state attribute value is set to Unlocked Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("LockState", actualValue));
                VerifyOrReturn(CheckValue("LockState", actualValue, 2U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestLockTheDoorBackPriorToNextTests_27()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterLockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"123456" length:6];
        [cluster lockDoorWithParams:params
                         completion:^(NSError * _Nullable err) {
                             NSLog(@"Lock the door back prior to next tests Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateADisabledUserAndCredential_28()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:2U];

        params.credentialData = [[NSData alloc] initWithBytes:"654321" length:6];
        params.userIndex = nil;
        params.userStatus = [NSNumber numberWithUnsignedChar:3U];
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create a disabled user and credential Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNonNull("UserIndex", actualValue));
                                 VerifyOrReturn(CheckValue("UserIndex", actualValue, 2U));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("NextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("NextCredentialIndex", actualValue, 3U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTryToUnlockTheDoorWithDisabledUserPin_29()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"654321" length:6];
        [cluster
            unlockDoorWithParams:params
                      completion:^(NSError * _Nullable err) {
                          NSLog(@"Try to unlock the door with disabled user PIN Error: %@", err);

                          VerifyOrReturn(CheckValue("status",
                              err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                  : 0,
                              EMBER_ZCL_STATUS_FAILURE));
                          NextTest();
                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatLockStateAttributeValueIsSetToLocked_30()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLockStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify that lock state attribute value is set to Locked Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("LockState", actualValue));
                VerifyOrReturn(CheckValue("LockState", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestUnlockTheDoorWithEnabledUserPin_31()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"123456" length:6];
        [cluster unlockDoorWithParams:params
                           completion:^(NSError * _Nullable err) {
                               NSLog(@"Unlock the door with enabled user PIN Error: %@", err);

                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                               NextTest();
                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatLockStateAttributeValueIsSetToUnlocked_32()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLockStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify that lock state attribute value is set to Unlocked Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("LockState", actualValue));
                VerifyOrReturn(CheckValue("LockState", actualValue, 2U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTryToLockTheDoorWithDisabledUserPin_33()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterLockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"654321" length:6];
        [cluster
            lockDoorWithParams:params
                    completion:^(NSError * _Nullable err) {
                        NSLog(@"Try to lock the door with disabled user PIN Error: %@", err);

                        VerifyOrReturn(CheckValue("status",
                            err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                : 0,
                            EMBER_ZCL_STATUS_FAILURE));
                        NextTest();
                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatLockStateAttributeValueStaysUnlocked_34()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLockStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify that lock state attribute value stays Unlocked Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("LockState", actualValue));
                VerifyOrReturn(CheckValue("LockState", actualValue, 2U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestLockTheDoorWithEnabledUserPin_35()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterLockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"123456" length:6];
        [cluster lockDoorWithParams:params
                         completion:^(NSError * _Nullable err) {
                             NSLog(@"Lock the door with enabled user PIN Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatLockStateAttributeValueIsSetToLocked_36()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLockStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Verify that lock state attribute value is set to Locked Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("LockState", actualValue));
                VerifyOrReturn(CheckValue("LockState", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCleanAllTheUsersAndCredentials_37()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:65534U];
        [cluster clearUserWithParams:params
                          completion:^(NSError * _Nullable err) {
                              NSLog(@"Clean all the users and credentials Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }
};

class DL_Schedules : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    DL_Schedules()
        : TestCommandBridge("DL_Schedules")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~DL_Schedules() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: DL_Schedules\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: DL_Schedules\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Create new PIN credential and schedule user\n");
            err = TestCreateNewPinCredentialAndScheduleUser_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Get number of supported users\n");
            err = TestGetNumberOfSupportedUsers_2();
            break;
        case 3:
            ChipLogProgress(
                chipTool, " ***** Test Step 3 : Get Max number of Week Day schedules for user and verify default value\n");
            err = TestGetMaxNumberOfWeekDaySchedulesForUserAndVerifyDefaultValue_3();
            break;
        case 4:
            ChipLogProgress(
                chipTool, " ***** Test Step 4 : Get Max number of Year Day schedules for user and verify default value\n");
            err = TestGetMaxNumberOfYearDaySchedulesForUserAndVerifyDefaultValue_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Get Max number of Holiday schedules and verify default value\n");
            err = TestGetMaxNumberOfHolidaySchedulesAndVerifyDefaultValue_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Create Week Day schedule with 0 index\n");
            err = TestCreateWeekDayScheduleWith0Index_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Create Week Day schedule with out-of-bounds index\n");
            err = TestCreateWeekDayScheduleWithOutOfBoundsIndex_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Create Week Day schedule with 0 user index\n");
            err = TestCreateWeekDayScheduleWith0UserIndex_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Create Week Day schedule with out-of-bounds user index\n");
            err = TestCreateWeekDayScheduleWithOutOfBoundsUserIndex_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Create Week Day schedule for non-existing user\n");
            err = TestCreateWeekDayScheduleForNonExistingUser_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Create Week Day schedule with 0 days mask\n");
            err = TestCreateWeekDayScheduleWith0DaysMask_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Create Week Day schedule for Sunday and Monday\n");
            err = TestCreateWeekDayScheduleForSundayAndMonday_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Create Week Day schedule for Sunday Wednesday and Saturday\n");
            err = TestCreateWeekDayScheduleForSundayWednesdayAndSaturday_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Create Week Day schedule with invalid start hour\n");
            err = TestCreateWeekDayScheduleWithInvalidStartHour_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Create Week Day schedule with invalid start minute\n");
            err = TestCreateWeekDayScheduleWithInvalidStartMinute_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Create Week Day schedule with invalid end hour\n");
            err = TestCreateWeekDayScheduleWithInvalidEndHour_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Create Week Day schedule with invalid end minute\n");
            err = TestCreateWeekDayScheduleWithInvalidEndMinute_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Create Week Day schedule with start hour later that end hour\n");
            err = TestCreateWeekDayScheduleWithStartHourLaterThatEndHour_18();
            break;
        case 19:
            ChipLogProgress(chipTool,
                " ***** Test Step 19 : Create Week Day schedule with start minute later that end minute when hours are equal\n");
            err = TestCreateWeekDayScheduleWithStartMinuteLaterThatEndMinuteWhenHoursAreEqual_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Make sure that previous operations did not create a schedule\n");
            err = TestMakeSureThatPreviousOperationsDidNotCreateASchedule_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Get Week Day schedule with 0 index\n");
            err = TestGetWeekDayScheduleWith0Index_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : Get Week Day schedule with out-of-bounds index\n");
            err = TestGetWeekDayScheduleWithOutOfBoundsIndex_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : Get Week Day schedule with 0 user index\n");
            err = TestGetWeekDayScheduleWith0UserIndex_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : Get Week Day schedule with out-of-bounds user index\n");
            err = TestGetWeekDayScheduleWithOutOfBoundsUserIndex_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : Get Week Day schedule with non-existing user index\n");
            err = TestGetWeekDayScheduleWithNonExistingUserIndex_25();
            break;
        case 26:
            ChipLogProgress(chipTool, " ***** Test Step 26 : Create Year Day schedule with 0 index\n");
            err = TestCreateYearDayScheduleWith0Index_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : Create Year Day schedule with out-of-bounds index\n");
            err = TestCreateYearDayScheduleWithOutOfBoundsIndex_27();
            break;
        case 28:
            ChipLogProgress(chipTool, " ***** Test Step 28 : Create Year Day schedule with 0 user index\n");
            err = TestCreateYearDayScheduleWith0UserIndex_28();
            break;
        case 29:
            ChipLogProgress(chipTool, " ***** Test Step 29 : Create Year Day schedule with out-of-bounds user index\n");
            err = TestCreateYearDayScheduleWithOutOfBoundsUserIndex_29();
            break;
        case 30:
            ChipLogProgress(chipTool, " ***** Test Step 30 : Create Year Day schedule for non-existing user\n");
            err = TestCreateYearDayScheduleForNonExistingUser_30();
            break;
        case 31:
            ChipLogProgress(chipTool, " ***** Test Step 31 : Create Year Day schedule with start hour later that end hour\n");
            err = TestCreateYearDayScheduleWithStartHourLaterThatEndHour_31();
            break;
        case 32:
            ChipLogProgress(chipTool, " ***** Test Step 32 : Make sure that previous operations did not create a schedule\n");
            err = TestMakeSureThatPreviousOperationsDidNotCreateASchedule_32();
            break;
        case 33:
            ChipLogProgress(chipTool, " ***** Test Step 33 : Get Year Day schedule with 0 index\n");
            err = TestGetYearDayScheduleWith0Index_33();
            break;
        case 34:
            ChipLogProgress(chipTool, " ***** Test Step 34 : Get Year Day schedule with out-of-bounds index\n");
            err = TestGetYearDayScheduleWithOutOfBoundsIndex_34();
            break;
        case 35:
            ChipLogProgress(chipTool, " ***** Test Step 35 : Get Year Day schedule with 0 user index\n");
            err = TestGetYearDayScheduleWith0UserIndex_35();
            break;
        case 36:
            ChipLogProgress(chipTool, " ***** Test Step 36 : Get Year Day schedule with out-of-bounds user index\n");
            err = TestGetYearDayScheduleWithOutOfBoundsUserIndex_36();
            break;
        case 37:
            ChipLogProgress(chipTool, " ***** Test Step 37 : Get Year Day schedule with non-existing user index\n");
            err = TestGetYearDayScheduleWithNonExistingUserIndex_37();
            break;
        case 38:
            ChipLogProgress(chipTool, " ***** Test Step 38 : Create Holiday schedule with 0 index\n");
            err = TestCreateHolidayScheduleWith0Index_38();
            break;
        case 39:
            ChipLogProgress(chipTool, " ***** Test Step 39 : Create Holiday schedule with out-of-bounds index\n");
            err = TestCreateHolidayScheduleWithOutOfBoundsIndex_39();
            break;
        case 40:
            ChipLogProgress(chipTool, " ***** Test Step 40 : Create Holiday schedule with start hour later that end hour\n");
            err = TestCreateHolidayScheduleWithStartHourLaterThatEndHour_40();
            break;
        case 41:
            ChipLogProgress(chipTool, " ***** Test Step 41 : Create Holiday schedule with invalid operating mode\n");
            err = TestCreateHolidayScheduleWithInvalidOperatingMode_41();
            break;
        case 42:
            ChipLogProgress(chipTool, " ***** Test Step 42 : Make sure that previous operations did not create a schedule\n");
            err = TestMakeSureThatPreviousOperationsDidNotCreateASchedule_42();
            break;
        case 43:
            ChipLogProgress(chipTool, " ***** Test Step 43 : Get Holiday schedule with 0 index\n");
            err = TestGetHolidayScheduleWith0Index_43();
            break;
        case 44:
            ChipLogProgress(chipTool, " ***** Test Step 44 : Get Holiday schedule with out-of-bounds index\n");
            err = TestGetHolidayScheduleWithOutOfBoundsIndex_44();
            break;
        case 45:
            ChipLogProgress(chipTool, " ***** Test Step 45 : Create Holiday schedule with valid parameters\n");
            err = TestCreateHolidayScheduleWithValidParameters_45();
            break;
        case 46:
            ChipLogProgress(chipTool, " ***** Test Step 46 : Verify created schedule\n");
            err = TestVerifyCreatedSchedule_46();
            break;
        case 47:
            ChipLogProgress(chipTool, " ***** Test Step 47 : Create Week Day schedule with valid parameters\n");
            err = TestCreateWeekDayScheduleWithValidParameters_47();
            break;
        case 48:
            ChipLogProgress(chipTool, " ***** Test Step 48 : Verify created schedule\n");
            err = TestVerifyCreatedSchedule_48();
            break;
        case 49:
            ChipLogProgress(chipTool, " ***** Test Step 49 : Create Year Day schedule with valid parameters\n");
            err = TestCreateYearDayScheduleWithValidParameters_49();
            break;
        case 50:
            ChipLogProgress(chipTool, " ***** Test Step 50 : Verify created schedule\n");
            err = TestVerifyCreatedSchedule_50();
            break;
        case 51:
            ChipLogProgress(chipTool, " ***** Test Step 51 : Clear Week Day schedule with 0 index\n");
            err = TestClearWeekDayScheduleWith0Index_51();
            break;
        case 52:
            ChipLogProgress(chipTool, " ***** Test Step 52 : Clear Week Day schedule with out-of-bounds index\n");
            err = TestClearWeekDayScheduleWithOutOfBoundsIndex_52();
            break;
        case 53:
            ChipLogProgress(chipTool, " ***** Test Step 53 : Clear Week Day schedule with 0 user index\n");
            err = TestClearWeekDayScheduleWith0UserIndex_53();
            break;
        case 54:
            ChipLogProgress(chipTool, " ***** Test Step 54 : Clear Week Day schedule with out-of-bounds user index\n");
            err = TestClearWeekDayScheduleWithOutOfBoundsUserIndex_54();
            break;
        case 55:
            ChipLogProgress(chipTool, " ***** Test Step 55 : Clear Week Day schedule with non-existing user\n");
            err = TestClearWeekDayScheduleWithNonExistingUser_55();
            break;
        case 56:
            ChipLogProgress(chipTool, " ***** Test Step 56 : Make sure that week day schedule was not deleted\n");
            err = TestMakeSureThatWeekDayScheduleWasNotDeleted_56();
            break;
        case 57:
            ChipLogProgress(chipTool, " ***** Test Step 57 : Make sure that year day schedule was not deleted\n");
            err = TestMakeSureThatYearDayScheduleWasNotDeleted_57();
            break;
        case 58:
            ChipLogProgress(chipTool, " ***** Test Step 58 : Make sure that holiday schedule was not deleted\n");
            err = TestMakeSureThatHolidayScheduleWasNotDeleted_58();
            break;
        case 59:
            ChipLogProgress(chipTool, " ***** Test Step 59 : Clear Year Day schedule with 0 index\n");
            err = TestClearYearDayScheduleWith0Index_59();
            break;
        case 60:
            ChipLogProgress(chipTool, " ***** Test Step 60 : Clear Year Day schedule with out-of-bounds index\n");
            err = TestClearYearDayScheduleWithOutOfBoundsIndex_60();
            break;
        case 61:
            ChipLogProgress(chipTool, " ***** Test Step 61 : Clear Year Day schedule with 0 user index\n");
            err = TestClearYearDayScheduleWith0UserIndex_61();
            break;
        case 62:
            ChipLogProgress(chipTool, " ***** Test Step 62 : Clear Year Day schedule with out-of-bounds user index\n");
            err = TestClearYearDayScheduleWithOutOfBoundsUserIndex_62();
            break;
        case 63:
            ChipLogProgress(chipTool, " ***** Test Step 63 : Clear Year Day schedule with non-existing user\n");
            err = TestClearYearDayScheduleWithNonExistingUser_63();
            break;
        case 64:
            ChipLogProgress(chipTool, " ***** Test Step 64 : Make sure that week day schedule was not deleted\n");
            err = TestMakeSureThatWeekDayScheduleWasNotDeleted_64();
            break;
        case 65:
            ChipLogProgress(chipTool, " ***** Test Step 65 : Make sure that year day schedule was not deleted\n");
            err = TestMakeSureThatYearDayScheduleWasNotDeleted_65();
            break;
        case 66:
            ChipLogProgress(chipTool, " ***** Test Step 66 : Make sure that holiday schedule was not deleted\n");
            err = TestMakeSureThatHolidayScheduleWasNotDeleted_66();
            break;
        case 67:
            ChipLogProgress(chipTool, " ***** Test Step 67 : Clear Holiday schedule with 0 index\n");
            err = TestClearHolidayScheduleWith0Index_67();
            break;
        case 68:
            ChipLogProgress(chipTool, " ***** Test Step 68 : Clear Holiday schedule with out-of-bounds index\n");
            err = TestClearHolidayScheduleWithOutOfBoundsIndex_68();
            break;
        case 69:
            ChipLogProgress(chipTool, " ***** Test Step 69 : Make sure that week day schedule was not deleted\n");
            err = TestMakeSureThatWeekDayScheduleWasNotDeleted_69();
            break;
        case 70:
            ChipLogProgress(chipTool, " ***** Test Step 70 : Make sure that year day schedule was not deleted\n");
            err = TestMakeSureThatYearDayScheduleWasNotDeleted_70();
            break;
        case 71:
            ChipLogProgress(chipTool, " ***** Test Step 71 : Make sure that holiday schedule was not deleted\n");
            err = TestMakeSureThatHolidayScheduleWasNotDeleted_71();
            break;
        case 72:
            ChipLogProgress(chipTool, " ***** Test Step 72 : Create another Week Day schedule with valid parameters\n");
            err = TestCreateAnotherWeekDayScheduleWithValidParameters_72();
            break;
        case 73:
            ChipLogProgress(chipTool, " ***** Test Step 73 : Verify created week day schedule\n");
            err = TestVerifyCreatedWeekDaySchedule_73();
            break;
        case 74:
            ChipLogProgress(chipTool, " ***** Test Step 74 : Create another Year Day schedule with valid parameters\n");
            err = TestCreateAnotherYearDayScheduleWithValidParameters_74();
            break;
        case 75:
            ChipLogProgress(chipTool, " ***** Test Step 75 : Verify created year day schedule\n");
            err = TestVerifyCreatedYearDaySchedule_75();
            break;
        case 76:
            ChipLogProgress(chipTool, " ***** Test Step 76 : Create another Holiday schedule with valid parameters\n");
            err = TestCreateAnotherHolidayScheduleWithValidParameters_76();
            break;
        case 77:
            ChipLogProgress(chipTool, " ***** Test Step 77 : Verify created holiday schedule\n");
            err = TestVerifyCreatedHolidaySchedule_77();
            break;
        case 78:
            ChipLogProgress(chipTool, " ***** Test Step 78 : Clear a single week day schedule for the first user\n");
            err = TestClearASingleWeekDayScheduleForTheFirstUser_78();
            break;
        case 79:
            ChipLogProgress(chipTool, " ***** Test Step 79 : Verify cleared week day schedule\n");
            err = TestVerifyClearedWeekDaySchedule_79();
            break;
        case 80:
            ChipLogProgress(chipTool, " ***** Test Step 80 : Clear all remaining week day schedules for the first user\n");
            err = TestClearAllRemainingWeekDaySchedulesForTheFirstUser_80();
            break;
        case 81:
            ChipLogProgress(chipTool, " ***** Test Step 81 : Verify cleared week schedule\n");
            err = TestVerifyClearedWeekSchedule_81();
            break;
        case 82:
            ChipLogProgress(chipTool, " ***** Test Step 82 : Make sure that first year day schedule was not deleted\n");
            err = TestMakeSureThatFirstYearDayScheduleWasNotDeleted_82();
            break;
        case 83:
            ChipLogProgress(chipTool, " ***** Test Step 83 : Make sure that second year day schedule was not deleted\n");
            err = TestMakeSureThatSecondYearDayScheduleWasNotDeleted_83();
            break;
        case 84:
            ChipLogProgress(chipTool, " ***** Test Step 84 : Make sure that first holiday schedule was not deleted\n");
            err = TestMakeSureThatFirstHolidayScheduleWasNotDeleted_84();
            break;
        case 85:
            ChipLogProgress(chipTool, " ***** Test Step 85 : Make sure that second holiday schedule was not deleted\n");
            err = TestMakeSureThatSecondHolidayScheduleWasNotDeleted_85();
            break;
        case 86:
            ChipLogProgress(chipTool, " ***** Test Step 86 : Create another Week Day schedule with valid parameters\n");
            err = TestCreateAnotherWeekDayScheduleWithValidParameters_86();
            break;
        case 87:
            ChipLogProgress(chipTool, " ***** Test Step 87 : Clear a single year day schedule for the first user\n");
            err = TestClearASingleYearDayScheduleForTheFirstUser_87();
            break;
        case 88:
            ChipLogProgress(chipTool, " ***** Test Step 88 : Verify cleared year day schedule\n");
            err = TestVerifyClearedYearDaySchedule_88();
            break;
        case 89:
            ChipLogProgress(chipTool, " ***** Test Step 89 : Clear all remaining year schedules for the first user\n");
            err = TestClearAllRemainingYearSchedulesForTheFirstUser_89();
            break;
        case 90:
            ChipLogProgress(chipTool, " ***** Test Step 90 : Verify that second year day schedule was cleared\n");
            err = TestVerifyThatSecondYearDayScheduleWasCleared_90();
            break;
        case 91:
            ChipLogProgress(chipTool, " ***** Test Step 91 : Verify created week day schedule\n");
            err = TestVerifyCreatedWeekDaySchedule_91();
            break;
        case 92:
            ChipLogProgress(chipTool, " ***** Test Step 92 : Clear all remaining week day schedules for the first user\n");
            err = TestClearAllRemainingWeekDaySchedulesForTheFirstUser_92();
            break;
        case 93:
            ChipLogProgress(
                chipTool, " ***** Test Step 93 : Create new user without credential so we can add more schedules to it\n");
            err = TestCreateNewUserWithoutCredentialSoWeCanAddMoreSchedulesToIt_93();
            break;
        case 94:
            ChipLogProgress(chipTool, " ***** Test Step 94 : Create Week Day schedule with valid parameters for first user\n");
            err = TestCreateWeekDayScheduleWithValidParametersForFirstUser_94();
            break;
        case 95:
            ChipLogProgress(chipTool, " ***** Test Step 95 : Verify created week day schedule for first user\n");
            err = TestVerifyCreatedWeekDayScheduleForFirstUser_95();
            break;
        case 96:
            ChipLogProgress(chipTool, " ***** Test Step 96 : Create Year Day schedule for first user\n");
            err = TestCreateYearDayScheduleForFirstUser_96();
            break;
        case 97:
            ChipLogProgress(chipTool, " ***** Test Step 97 : Verify created year day schedule for first\n");
            err = TestVerifyCreatedYearDayScheduleForFirst_97();
            break;
        case 98:
            ChipLogProgress(chipTool, " ***** Test Step 98 : Create Week Day schedule with valid parameters for second user\n");
            err = TestCreateWeekDayScheduleWithValidParametersForSecondUser_98();
            break;
        case 99:
            ChipLogProgress(chipTool, " ***** Test Step 99 : Verify created week day schedule for first user\n");
            err = TestVerifyCreatedWeekDayScheduleForFirstUser_99();
            break;
        case 100:
            ChipLogProgress(chipTool, " ***** Test Step 100 : Create Year Day schedule for second user\n");
            err = TestCreateYearDayScheduleForSecondUser_100();
            break;
        case 101:
            ChipLogProgress(chipTool, " ***** Test Step 101 : Verify created year day schedule for first\n");
            err = TestVerifyCreatedYearDayScheduleForFirst_101();
            break;
        case 102:
            ChipLogProgress(chipTool, " ***** Test Step 102 : Cleanup the user\n");
            err = TestCleanupTheUser_102();
            break;
        case 103:
            ChipLogProgress(chipTool, " ***** Test Step 103 : Make sure clearing first user also cleared week day schedules\n");
            err = TestMakeSureClearingFirstUserAlsoClearedWeekDaySchedules_103();
            break;
        case 104:
            ChipLogProgress(chipTool, " ***** Test Step 104 : Make sure clearing first user also cleared year day schedules\n");
            err = TestMakeSureClearingFirstUserAlsoClearedYearDaySchedules_104();
            break;
        case 105:
            ChipLogProgress(chipTool, " ***** Test Step 105 : Make sure clearing second user also cleared week day schedules\n");
            err = TestMakeSureClearingSecondUserAlsoClearedWeekDaySchedules_105();
            break;
        case 106:
            ChipLogProgress(chipTool, " ***** Test Step 106 : Make sure clearing second user also cleared year day schedules\n");
            err = TestMakeSureClearingSecondUserAlsoClearedYearDaySchedules_106();
            break;
        case 107:
            ChipLogProgress(chipTool, " ***** Test Step 107 : Make sure that first holiday schedule was not deleted\n");
            err = TestMakeSureThatFirstHolidayScheduleWasNotDeleted_107();
            break;
        case 108:
            ChipLogProgress(chipTool, " ***** Test Step 108 : Make sure that second holiday schedule was not deleted\n");
            err = TestMakeSureThatSecondHolidayScheduleWasNotDeleted_108();
            break;
        case 109:
            ChipLogProgress(chipTool, " ***** Test Step 109 : Create another Holiday schedule at the last slot\n");
            err = TestCreateAnotherHolidayScheduleAtTheLastSlot_109();
            break;
        case 110:
            ChipLogProgress(chipTool, " ***** Test Step 110 : Verify Created Holiday Schedule\n");
            err = TestVerifyCreatedHolidaySchedule_110();
            break;
        case 111:
            ChipLogProgress(chipTool, " ***** Test Step 111 : Create new PIN credential and schedule user\n");
            err = TestCreateNewPinCredentialAndScheduleUser_111();
            break;
        case 112:
            ChipLogProgress(chipTool, " ***** Test Step 112 : Create Week Day schedule for first user\n");
            err = TestCreateWeekDayScheduleForFirstUser_112();
            break;
        case 113:
            ChipLogProgress(chipTool, " ***** Test Step 113 : Create Year Day schedule for first user\n");
            err = TestCreateYearDayScheduleForFirstUser_113();
            break;
        case 114:
            ChipLogProgress(chipTool, " ***** Test Step 114 : Clear a single holiday schedule\n");
            err = TestClearASingleHolidaySchedule_114();
            break;
        case 115:
            ChipLogProgress(chipTool, " ***** Test Step 115 : Make sure that first holiday schedule was not deleted\n");
            err = TestMakeSureThatFirstHolidayScheduleWasNotDeleted_115();
            break;
        case 116:
            ChipLogProgress(chipTool, " ***** Test Step 116 : Make sure that second holiday schedule was deleted\n");
            err = TestMakeSureThatSecondHolidayScheduleWasDeleted_116();
            break;
        case 117:
            ChipLogProgress(chipTool, " ***** Test Step 117 : Make sure that third holiday schedule was not deleted\n");
            err = TestMakeSureThatThirdHolidayScheduleWasNotDeleted_117();
            break;
        case 118:
            ChipLogProgress(
                chipTool, " ***** Test Step 118 : Make sure clearing holiday schedule did not clear week day schedule\n");
            err = TestMakeSureClearingHolidayScheduleDidNotClearWeekDaySchedule_118();
            break;
        case 119:
            ChipLogProgress(
                chipTool, " ***** Test Step 119 : Make sure clearing holiday schedule did not clear year day schedule\n");
            err = TestMakeSureClearingHolidayScheduleDidNotClearYearDaySchedule_119();
            break;
        case 120:
            ChipLogProgress(chipTool, " ***** Test Step 120 : Clear all remaining holiday schedules\n");
            err = TestClearAllRemainingHolidaySchedules_120();
            break;
        case 121:
            ChipLogProgress(chipTool, " ***** Test Step 121 : Make sure that first holiday is still deleted\n");
            err = TestMakeSureThatFirstHolidayIsStillDeleted_121();
            break;
        case 122:
            ChipLogProgress(chipTool, " ***** Test Step 122 : Make sure that second holiday schedule was deleted\n");
            err = TestMakeSureThatSecondHolidayScheduleWasDeleted_122();
            break;
        case 123:
            ChipLogProgress(chipTool, " ***** Test Step 123 : Make sure that third holiday schedule was not deleted\n");
            err = TestMakeSureThatThirdHolidayScheduleWasNotDeleted_123();
            break;
        case 124:
            ChipLogProgress(
                chipTool, " ***** Test Step 124 : Make sure clearing holiday schedule did not clear week day schedule\n");
            err = TestMakeSureClearingHolidayScheduleDidNotClearWeekDaySchedule_124();
            break;
        case 125:
            ChipLogProgress(
                chipTool, " ***** Test Step 125 : Make sure clearing holiday schedule did not clear year day schedule\n");
            err = TestMakeSureClearingHolidayScheduleDidNotClearYearDaySchedule_125();
            break;
        case 126:
            ChipLogProgress(chipTool, " ***** Test Step 126 : Final Cleanup\n");
            err = TestFinalCleanup_126();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            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), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            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), EMBER_ZCL_STATUS_INVALID_COMMAND));
            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), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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));
            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));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            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));
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 46:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 50:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 51:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 52:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 53:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 54:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            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));
            break;
        case 57:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 58:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 59:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 60:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 61:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 62:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            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));
            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), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 68:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 69:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 70:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 71:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 72:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 73:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 77:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 78:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 79:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 80:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 81:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 82:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 83:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 87:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 88:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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));
            break;
        case 91:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 92:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 93:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 94:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 95:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 96:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 101:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 102:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 103:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 104:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 105:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 106:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 107:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 108:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 109:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 110:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 111:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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));
            break;
        case 119:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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));
            break;
        case 122:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 123:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 124:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 125:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 126:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 127;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestCreateNewPinCredentialAndScheduleUser_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        params.credentialData = [[NSData alloc] initWithBytes:"123456" length:6];
        params.userIndex = nil;
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new PIN credential and schedule user Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNonNull("UserIndex", actualValue));
                                 VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("NextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("NextCredentialIndex", actualValue, 2U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull NumberOfTotalUsersSupported;

    CHIP_ERROR TestGetNumberOfSupportedUsers_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNumberOfTotalUsersSupportedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Get number of supported users Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("NumberOfTotalUsersSupported", actualValue, 10U));
            }
            {
                NumberOfTotalUsersSupported = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull NumberOfWeekDaySchedulesSupportedPerUser;

    CHIP_ERROR TestGetMaxNumberOfWeekDaySchedulesForUserAndVerifyDefaultValue_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNumberOfWeekDaySchedulesSupportedPerUserWithCompletion:^(
            NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Get Max number of Week Day schedules for user and verify default value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("NumberOfWeekDaySchedulesSupportedPerUser", actualValue, 10U));
            }
            {
                NumberOfWeekDaySchedulesSupportedPerUser = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull NumberOfYearDaySchedulesSupportedPerUser;

    CHIP_ERROR TestGetMaxNumberOfYearDaySchedulesForUserAndVerifyDefaultValue_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNumberOfYearDaySchedulesSupportedPerUserWithCompletion:^(
            NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Get Max number of Year Day schedules for user and verify default value Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("NumberOfYearDaySchedulesSupportedPerUser", actualValue, 10U));
            }
            {
                NumberOfYearDaySchedulesSupportedPerUser = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull NumberOfHolidaySchedulesSupported;

    CHIP_ERROR TestGetMaxNumberOfHolidaySchedulesAndVerifyDefaultValue_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeNumberOfHolidaySchedulesSupportedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"Get Max number of Holiday schedules and verify default value Error: %@", err);

                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                {
                    id actualValue = value;
                    VerifyOrReturn(CheckValue("NumberOfHolidaySchedulesSupported", actualValue, 10U));
                }
                {
                    NumberOfHolidaySchedulesSupported = value;
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleWith0Index_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.daysMask = [NSNumber numberWithUnsignedChar:1U];
        params.startHour = [NSNumber numberWithUnsignedChar:15U];
        params.startMinute = [NSNumber numberWithUnsignedChar:16U];
        params.endHour = [NSNumber numberWithUnsignedChar:18U];
        params.endMinute = [NSNumber numberWithUnsignedChar:0U];
        [cluster setWeekDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Week Day schedule with 0 index Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_COMMAND));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleWithOutOfBoundsIndex_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:[NumberOfWeekDaySchedulesSupportedPerUser unsignedCharValue] + 1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.daysMask = [NSNumber numberWithUnsignedChar:1U];
        params.startHour = [NSNumber numberWithUnsignedChar:15U];
        params.startMinute = [NSNumber numberWithUnsignedChar:16U];
        params.endHour = [NSNumber numberWithUnsignedChar:18U];
        params.endMinute = [NSNumber numberWithUnsignedChar:0U];
        [cluster setWeekDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Week Day schedule with out-of-bounds index Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_COMMAND));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleWith0UserIndex_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:0U];
        params.daysMask = [NSNumber numberWithUnsignedChar:1U];
        params.startHour = [NSNumber numberWithUnsignedChar:15U];
        params.startMinute = [NSNumber numberWithUnsignedChar:16U];
        params.endHour = [NSNumber numberWithUnsignedChar:18U];
        params.endMinute = [NSNumber numberWithUnsignedChar:0U];
        [cluster setWeekDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Week Day schedule with 0 user index Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_COMMAND));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleWithOutOfBoundsUserIndex_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:[NumberOfTotalUsersSupported unsignedShortValue] + 1U];
        params.daysMask = [NSNumber numberWithUnsignedChar:1U];
        params.startHour = [NSNumber numberWithUnsignedChar:15U];
        params.startMinute = [NSNumber numberWithUnsignedChar:16U];
        params.endHour = [NSNumber numberWithUnsignedChar:18U];
        params.endMinute = [NSNumber numberWithUnsignedChar:0U];
        [cluster setWeekDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Week Day schedule with out-of-bounds user index Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_COMMAND));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleForNonExistingUser_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:2U];
        params.daysMask = [NSNumber numberWithUnsignedChar:1U];
        params.startHour = [NSNumber numberWithUnsignedChar:15U];
        params.startMinute = [NSNumber numberWithUnsignedChar:16U];
        params.endHour = [NSNumber numberWithUnsignedChar:18U];
        params.endMinute = [NSNumber numberWithUnsignedChar:0U];
        [cluster setWeekDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Week Day schedule for non-existing user Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_FAILURE));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleWith0DaysMask_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.daysMask = [NSNumber numberWithUnsignedChar:0U];
        params.startHour = [NSNumber numberWithUnsignedChar:15U];
        params.startMinute = [NSNumber numberWithUnsignedChar:16U];
        params.endHour = [NSNumber numberWithUnsignedChar:18U];
        params.endMinute = [NSNumber numberWithUnsignedChar:0U];
        [cluster setWeekDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Week Day schedule with 0 days mask Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_COMMAND));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleForSundayAndMonday_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.daysMask = [NSNumber numberWithUnsignedChar:3U];
        params.startHour = [NSNumber numberWithUnsignedChar:15U];
        params.startMinute = [NSNumber numberWithUnsignedChar:16U];
        params.endHour = [NSNumber numberWithUnsignedChar:18U];
        params.endMinute = [NSNumber numberWithUnsignedChar:0U];
        [cluster setWeekDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Week Day schedule for Sunday and Monday Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_COMMAND));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleForSundayWednesdayAndSaturday_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.daysMask = [NSNumber numberWithUnsignedChar:73U];
        params.startHour = [NSNumber numberWithUnsignedChar:15U];
        params.startMinute = [NSNumber numberWithUnsignedChar:16U];
        params.endHour = [NSNumber numberWithUnsignedChar:18U];
        params.endMinute = [NSNumber numberWithUnsignedChar:0U];
        [cluster setWeekDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Week Day schedule for Sunday Wednesday and Saturday Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_COMMAND));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleWithInvalidStartHour_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.daysMask = [NSNumber numberWithUnsignedChar:1U];
        params.startHour = [NSNumber numberWithUnsignedChar:24U];
        params.startMinute = [NSNumber numberWithUnsignedChar:16U];
        params.endHour = [NSNumber numberWithUnsignedChar:18U];
        params.endMinute = [NSNumber numberWithUnsignedChar:0U];
        [cluster setWeekDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Week Day schedule with invalid start hour Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_COMMAND));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleWithInvalidStartMinute_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.daysMask = [NSNumber numberWithUnsignedChar:1U];
        params.startHour = [NSNumber numberWithUnsignedChar:15U];
        params.startMinute = [NSNumber numberWithUnsignedChar:60U];
        params.endHour = [NSNumber numberWithUnsignedChar:18U];
        params.endMinute = [NSNumber numberWithUnsignedChar:0U];
        [cluster setWeekDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Week Day schedule with invalid start minute Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_COMMAND));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleWithInvalidEndHour_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.daysMask = [NSNumber numberWithUnsignedChar:1U];
        params.startHour = [NSNumber numberWithUnsignedChar:15U];
        params.startMinute = [NSNumber numberWithUnsignedChar:16U];
        params.endHour = [NSNumber numberWithUnsignedChar:24U];
        params.endMinute = [NSNumber numberWithUnsignedChar:0U];
        [cluster setWeekDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Week Day schedule with invalid end hour Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_COMMAND));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleWithInvalidEndMinute_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.daysMask = [NSNumber numberWithUnsignedChar:1U];
        params.startHour = [NSNumber numberWithUnsignedChar:15U];
        params.startMinute = [NSNumber numberWithUnsignedChar:16U];
        params.endHour = [NSNumber numberWithUnsignedChar:18U];
        params.endMinute = [NSNumber numberWithUnsignedChar:60U];
        [cluster setWeekDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Week Day schedule with invalid end minute Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_COMMAND));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleWithStartHourLaterThatEndHour_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.daysMask = [NSNumber numberWithUnsignedChar:1U];
        params.startHour = [NSNumber numberWithUnsignedChar:19U];
        params.startMinute = [NSNumber numberWithUnsignedChar:16U];
        params.endHour = [NSNumber numberWithUnsignedChar:18U];
        params.endMinute = [NSNumber numberWithUnsignedChar:0U];
        [cluster setWeekDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Week Day schedule with start hour later that end hour Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_COMMAND));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleWithStartMinuteLaterThatEndMinuteWhenHoursAreEqual_19()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.daysMask = [NSNumber numberWithUnsignedChar:1U];
        params.startHour = [NSNumber numberWithUnsignedChar:15U];
        params.startMinute = [NSNumber numberWithUnsignedChar:50U];
        params.endHour = [NSNumber numberWithUnsignedChar:15U];
        params.endMinute = [NSNumber numberWithUnsignedChar:49U];
        [cluster setWeekDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Week Day schedule with start minute later that end minute when hours are "
                                             @"equal Error: %@",
                                           err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_COMMAND));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatPreviousOperationsDidNotCreateASchedule_20()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getWeekDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure that previous operations did not create a schedule Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.weekDayIndex;
                                           VerifyOrReturn(CheckValue("WeekDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 139U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGetWeekDayScheduleWith0Index_21()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getWeekDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Get Week Day schedule with 0 index Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.weekDayIndex;
                                           VerifyOrReturn(CheckValue("WeekDayIndex", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 133U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGetWeekDayScheduleWithOutOfBoundsIndex_22()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:[NumberOfWeekDaySchedulesSupportedPerUser unsignedCharValue] + 1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getWeekDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Get Week Day schedule with out-of-bounds index Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.weekDayIndex;
                                           VerifyOrReturn(CheckValue("WeekDayIndex", actualValue,
                                               [NumberOfWeekDaySchedulesSupportedPerUser unsignedCharValue] + 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 133U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGetWeekDayScheduleWith0UserIndex_23()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:0U];
        [cluster getWeekDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Get Week Day schedule with 0 user index Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.weekDayIndex;
                                           VerifyOrReturn(CheckValue("WeekDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("UserIndex", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 133U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGetWeekDayScheduleWithOutOfBoundsUserIndex_24()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:[NumberOfTotalUsersSupported unsignedShortValue] + 1U];
        [cluster getWeekDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Get Week Day schedule with out-of-bounds user index Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.weekDayIndex;
                                           VerifyOrReturn(CheckValue("WeekDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue(
                                               "UserIndex", actualValue, [NumberOfTotalUsersSupported unsignedShortValue] + 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 133U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGetWeekDayScheduleWithNonExistingUserIndex_25()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:2U];
        [cluster getWeekDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Get Week Day schedule with non-existing user index Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.weekDayIndex;
                                           VerifyOrReturn(CheckValue("WeekDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("UserIndex", actualValue, 2U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 1U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateYearDayScheduleWith0Index_26()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.localStartTime = [NSNumber numberWithUnsignedInt:12345UL];
        params.localEndTime = [NSNumber numberWithUnsignedInt:12345689UL];
        [cluster setYearDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Year Day schedule with 0 index Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_COMMAND));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateYearDayScheduleWithOutOfBoundsIndex_27()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:[NumberOfYearDaySchedulesSupportedPerUser unsignedCharValue] + 1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.localStartTime = [NSNumber numberWithUnsignedInt:12345UL];
        params.localEndTime = [NSNumber numberWithUnsignedInt:12345689UL];
        [cluster setYearDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Year Day schedule with out-of-bounds index Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_COMMAND));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateYearDayScheduleWith0UserIndex_28()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:0U];
        params.localStartTime = [NSNumber numberWithUnsignedInt:12345UL];
        params.localEndTime = [NSNumber numberWithUnsignedInt:12345689UL];
        [cluster setYearDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Year Day schedule with 0 user index Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_COMMAND));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateYearDayScheduleWithOutOfBoundsUserIndex_29()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:[NumberOfTotalUsersSupported unsignedShortValue] + 1U];
        params.localStartTime = [NSNumber numberWithUnsignedInt:12345UL];
        params.localEndTime = [NSNumber numberWithUnsignedInt:12345689UL];
        [cluster setYearDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Year Day schedule with out-of-bounds user index Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_COMMAND));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateYearDayScheduleForNonExistingUser_30()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:2U];
        params.localStartTime = [NSNumber numberWithUnsignedInt:12345UL];
        params.localEndTime = [NSNumber numberWithUnsignedInt:12345689UL];
        [cluster setYearDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Year Day schedule for non-existing user Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_FAILURE));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateYearDayScheduleWithStartHourLaterThatEndHour_31()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.localStartTime = [NSNumber numberWithUnsignedInt:12345689UL];
        params.localEndTime = [NSNumber numberWithUnsignedInt:12345688UL];
        [cluster setYearDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Year Day schedule with start hour later that end hour Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_COMMAND));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatPreviousOperationsDidNotCreateASchedule_32()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure that previous operations did not create a schedule Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("YearDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 139U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGetYearDayScheduleWith0Index_33()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Get Year Day schedule with 0 index Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("YearDayIndex", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 133U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGetYearDayScheduleWithOutOfBoundsIndex_34()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:[NumberOfYearDaySchedulesSupportedPerUser unsignedCharValue] + 1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Get Year Day schedule with out-of-bounds index Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("YearDayIndex", actualValue,
                                               [NumberOfYearDaySchedulesSupportedPerUser unsignedCharValue] + 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 133U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGetYearDayScheduleWith0UserIndex_35()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:0U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Get Year Day schedule with 0 user index Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("YearDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("UserIndex", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 133U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGetYearDayScheduleWithOutOfBoundsUserIndex_36()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:[NumberOfTotalUsersSupported unsignedShortValue] + 1U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Get Year Day schedule with out-of-bounds user index Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("YearDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue(
                                               "UserIndex", actualValue, [NumberOfTotalUsersSupported unsignedShortValue] + 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 133U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGetYearDayScheduleWithNonExistingUserIndex_37()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:2U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Get Year Day schedule with non-existing user index Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("YearDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("UserIndex", actualValue, 2U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 1U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateHolidayScheduleWith0Index_38()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:0U];
        params.localStartTime = [NSNumber numberWithUnsignedInt:12345UL];
        params.localEndTime = [NSNumber numberWithUnsignedInt:12345689UL];
        params.operatingMode = [NSNumber numberWithUnsignedChar:0U];
        [cluster setHolidayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Holiday schedule with 0 index Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_COMMAND));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateHolidayScheduleWithOutOfBoundsIndex_39()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:[NumberOfHolidaySchedulesSupported unsignedCharValue] + 1U];
        params.localStartTime = [NSNumber numberWithUnsignedInt:12345UL];
        params.localEndTime = [NSNumber numberWithUnsignedInt:12345689UL];
        params.operatingMode = [NSNumber numberWithUnsignedChar:0U];
        [cluster setHolidayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Holiday schedule with out-of-bounds index Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_COMMAND));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateHolidayScheduleWithStartHourLaterThatEndHour_40()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.localStartTime = [NSNumber numberWithUnsignedInt:12345689UL];
        params.localEndTime = [NSNumber numberWithUnsignedInt:12345688UL];
        params.operatingMode = [NSNumber numberWithUnsignedChar:0U];
        [cluster setHolidayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Holiday schedule with start hour later that end hour Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_COMMAND));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateHolidayScheduleWithInvalidOperatingMode_41()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.localStartTime = [NSNumber numberWithUnsignedInt:12345UL];
        params.localEndTime = [NSNumber numberWithUnsignedInt:12345689UL];
        params.operatingMode = [NSNumber numberWithUnsignedChar:5U];
        [cluster setHolidayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Holiday schedule with invalid operating mode Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_COMMAND));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatPreviousOperationsDidNotCreateASchedule_42()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:1U];
        [cluster getHolidayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetHolidayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure that previous operations did not create a schedule Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.holidayIndex;
                                           VerifyOrReturn(CheckValue("HolidayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 139U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGetHolidayScheduleWith0Index_43()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:0U];
        [cluster getHolidayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetHolidayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Get Holiday schedule with 0 index Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.holidayIndex;
                                           VerifyOrReturn(CheckValue("HolidayIndex", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 133U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGetHolidayScheduleWithOutOfBoundsIndex_44()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:[NumberOfHolidaySchedulesSupported unsignedCharValue] + 1U];
        [cluster getHolidayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetHolidayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Get Holiday schedule with out-of-bounds index Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.holidayIndex;
                                           VerifyOrReturn(CheckValue("HolidayIndex", actualValue,
                                               [NumberOfHolidaySchedulesSupported unsignedCharValue] + 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 133U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateHolidayScheduleWithValidParameters_45()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.localStartTime = [NSNumber numberWithUnsignedInt:12345UL];
        params.localEndTime = [NSNumber numberWithUnsignedInt:12345689UL];
        params.operatingMode = [NSNumber numberWithUnsignedChar:0U];
        [cluster setHolidayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Holiday schedule with valid parameters Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyCreatedSchedule_46()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:1U];
        [cluster getHolidayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetHolidayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Verify created schedule Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.holidayIndex;
                                           VerifyOrReturn(CheckValue("HolidayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.localStartTime;
                                           VerifyOrReturn(CheckValue("LocalStartTime", actualValue, 12345UL));
                                       }

                                       {
                                           id actualValue = values.localEndTime;
                                           VerifyOrReturn(CheckValue("LocalEndTime", actualValue, 12345689UL));
                                       }

                                       {
                                           id actualValue = values.operatingMode;
                                           VerifyOrReturn(CheckValue("OperatingMode", actualValue, 0U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleWithValidParameters_47()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.daysMask = [NSNumber numberWithUnsignedChar:1U];
        params.startHour = [NSNumber numberWithUnsignedChar:15U];
        params.startMinute = [NSNumber numberWithUnsignedChar:16U];
        params.endHour = [NSNumber numberWithUnsignedChar:18U];
        params.endMinute = [NSNumber numberWithUnsignedChar:0U];
        [cluster setWeekDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Week Day schedule with valid parameters Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyCreatedSchedule_48()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getWeekDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Verify created schedule Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.weekDayIndex;
                                           VerifyOrReturn(CheckValue("WeekDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.daysMask;
                                           VerifyOrReturn(CheckValue("DaysMask", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.startHour;
                                           VerifyOrReturn(CheckValue("StartHour", actualValue, 15U));
                                       }

                                       {
                                           id actualValue = values.startMinute;
                                           VerifyOrReturn(CheckValue("StartMinute", actualValue, 16U));
                                       }

                                       {
                                           id actualValue = values.endHour;
                                           VerifyOrReturn(CheckValue("EndHour", actualValue, 18U));
                                       }

                                       {
                                           id actualValue = values.endMinute;
                                           VerifyOrReturn(CheckValue("EndMinute", actualValue, 0U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateYearDayScheduleWithValidParameters_49()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.localStartTime = [NSNumber numberWithUnsignedInt:12345UL];
        params.localEndTime = [NSNumber numberWithUnsignedInt:12345689UL];
        [cluster setYearDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Year Day schedule with valid parameters Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyCreatedSchedule_50()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Verify created schedule Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("YearDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.localStartTime;
                                           VerifyOrReturn(CheckValue("LocalStartTime", actualValue, 12345UL));
                                       }

                                       {
                                           id actualValue = values.localEndTime;
                                           VerifyOrReturn(CheckValue("LocalEndTime", actualValue, 12345689UL));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearWeekDayScheduleWith0Index_51()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster
            clearWeekDayScheduleWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clear Week Day schedule with 0 index Error: %@", err);

                                    VerifyOrReturn(CheckValue("status",
                                        err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                      : EMBER_ZCL_STATUS_FAILURE)
                                            : 0,
                                        EMBER_ZCL_STATUS_INVALID_COMMAND));
                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearWeekDayScheduleWithOutOfBoundsIndex_52()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:[NumberOfWeekDaySchedulesSupportedPerUser unsignedCharValue] + 1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster
            clearWeekDayScheduleWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clear Week Day schedule with out-of-bounds index Error: %@", err);

                                    VerifyOrReturn(CheckValue("status",
                                        err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                      : EMBER_ZCL_STATUS_FAILURE)
                                            : 0,
                                        EMBER_ZCL_STATUS_INVALID_COMMAND));
                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearWeekDayScheduleWith0UserIndex_53()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:0U];
        [cluster
            clearWeekDayScheduleWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clear Week Day schedule with 0 user index Error: %@", err);

                                    VerifyOrReturn(CheckValue("status",
                                        err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                      : EMBER_ZCL_STATUS_FAILURE)
                                            : 0,
                                        EMBER_ZCL_STATUS_INVALID_COMMAND));
                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearWeekDayScheduleWithOutOfBoundsUserIndex_54()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:[NumberOfTotalUsersSupported unsignedShortValue] + 1U];
        [cluster
            clearWeekDayScheduleWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clear Week Day schedule with out-of-bounds user index Error: %@", err);

                                    VerifyOrReturn(CheckValue("status",
                                        err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                      : EMBER_ZCL_STATUS_FAILURE)
                                            : 0,
                                        EMBER_ZCL_STATUS_INVALID_COMMAND));
                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearWeekDayScheduleWithNonExistingUser_55()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:2U];
        [cluster
            clearWeekDayScheduleWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clear Week Day schedule with non-existing user Error: %@", err);

                                    VerifyOrReturn(CheckValue("status",
                                        err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                      : EMBER_ZCL_STATUS_FAILURE)
                                            : 0,
                                        EMBER_ZCL_STATUS_FAILURE));
                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatWeekDayScheduleWasNotDeleted_56()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getWeekDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure that week day schedule was not deleted Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.weekDayIndex;
                                           VerifyOrReturn(CheckValue("WeekDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.daysMask;
                                           VerifyOrReturn(CheckValue("DaysMask", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.startHour;
                                           VerifyOrReturn(CheckValue("StartHour", actualValue, 15U));
                                       }

                                       {
                                           id actualValue = values.startMinute;
                                           VerifyOrReturn(CheckValue("StartMinute", actualValue, 16U));
                                       }

                                       {
                                           id actualValue = values.endHour;
                                           VerifyOrReturn(CheckValue("EndHour", actualValue, 18U));
                                       }

                                       {
                                           id actualValue = values.endMinute;
                                           VerifyOrReturn(CheckValue("EndMinute", actualValue, 0U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatYearDayScheduleWasNotDeleted_57()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure that year day schedule was not deleted Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("YearDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.localStartTime;
                                           VerifyOrReturn(CheckValue("LocalStartTime", actualValue, 12345UL));
                                       }

                                       {
                                           id actualValue = values.localEndTime;
                                           VerifyOrReturn(CheckValue("LocalEndTime", actualValue, 12345689UL));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatHolidayScheduleWasNotDeleted_58()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:1U];
        [cluster getHolidayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetHolidayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure that holiday schedule was not deleted Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.holidayIndex;
                                           VerifyOrReturn(CheckValue("HolidayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.localStartTime;
                                           VerifyOrReturn(CheckValue("LocalStartTime", actualValue, 12345UL));
                                       }

                                       {
                                           id actualValue = values.localEndTime;
                                           VerifyOrReturn(CheckValue("LocalEndTime", actualValue, 12345689UL));
                                       }

                                       {
                                           id actualValue = values.operatingMode;
                                           VerifyOrReturn(CheckValue("OperatingMode", actualValue, 0U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearYearDayScheduleWith0Index_59()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster
            clearYearDayScheduleWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clear Year Day schedule with 0 index Error: %@", err);

                                    VerifyOrReturn(CheckValue("status",
                                        err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                      : EMBER_ZCL_STATUS_FAILURE)
                                            : 0,
                                        EMBER_ZCL_STATUS_INVALID_COMMAND));
                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearYearDayScheduleWithOutOfBoundsIndex_60()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:[NumberOfYearDaySchedulesSupportedPerUser unsignedCharValue] + 1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster
            clearYearDayScheduleWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clear Year Day schedule with out-of-bounds index Error: %@", err);

                                    VerifyOrReturn(CheckValue("status",
                                        err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                      : EMBER_ZCL_STATUS_FAILURE)
                                            : 0,
                                        EMBER_ZCL_STATUS_INVALID_COMMAND));
                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearYearDayScheduleWith0UserIndex_61()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:0U];
        [cluster
            clearYearDayScheduleWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clear Year Day schedule with 0 user index Error: %@", err);

                                    VerifyOrReturn(CheckValue("status",
                                        err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                      : EMBER_ZCL_STATUS_FAILURE)
                                            : 0,
                                        EMBER_ZCL_STATUS_INVALID_COMMAND));
                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearYearDayScheduleWithOutOfBoundsUserIndex_62()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:[NumberOfTotalUsersSupported unsignedShortValue] + 1U];
        [cluster
            clearYearDayScheduleWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clear Year Day schedule with out-of-bounds user index Error: %@", err);

                                    VerifyOrReturn(CheckValue("status",
                                        err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                      : EMBER_ZCL_STATUS_FAILURE)
                                            : 0,
                                        EMBER_ZCL_STATUS_INVALID_COMMAND));
                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearYearDayScheduleWithNonExistingUser_63()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:2U];
        [cluster
            clearYearDayScheduleWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clear Year Day schedule with non-existing user Error: %@", err);

                                    VerifyOrReturn(CheckValue("status",
                                        err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                      : EMBER_ZCL_STATUS_FAILURE)
                                            : 0,
                                        EMBER_ZCL_STATUS_FAILURE));
                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatWeekDayScheduleWasNotDeleted_64()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getWeekDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure that week day schedule was not deleted Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.weekDayIndex;
                                           VerifyOrReturn(CheckValue("WeekDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.daysMask;
                                           VerifyOrReturn(CheckValue("DaysMask", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.startHour;
                                           VerifyOrReturn(CheckValue("StartHour", actualValue, 15U));
                                       }

                                       {
                                           id actualValue = values.startMinute;
                                           VerifyOrReturn(CheckValue("StartMinute", actualValue, 16U));
                                       }

                                       {
                                           id actualValue = values.endHour;
                                           VerifyOrReturn(CheckValue("EndHour", actualValue, 18U));
                                       }

                                       {
                                           id actualValue = values.endMinute;
                                           VerifyOrReturn(CheckValue("EndMinute", actualValue, 0U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatYearDayScheduleWasNotDeleted_65()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure that year day schedule was not deleted Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("YearDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.localStartTime;
                                           VerifyOrReturn(CheckValue("LocalStartTime", actualValue, 12345UL));
                                       }

                                       {
                                           id actualValue = values.localEndTime;
                                           VerifyOrReturn(CheckValue("LocalEndTime", actualValue, 12345689UL));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatHolidayScheduleWasNotDeleted_66()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:1U];
        [cluster getHolidayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetHolidayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure that holiday schedule was not deleted Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.holidayIndex;
                                           VerifyOrReturn(CheckValue("HolidayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.localStartTime;
                                           VerifyOrReturn(CheckValue("LocalStartTime", actualValue, 12345UL));
                                       }

                                       {
                                           id actualValue = values.localEndTime;
                                           VerifyOrReturn(CheckValue("LocalEndTime", actualValue, 12345689UL));
                                       }

                                       {
                                           id actualValue = values.operatingMode;
                                           VerifyOrReturn(CheckValue("OperatingMode", actualValue, 0U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearHolidayScheduleWith0Index_67()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:0U];
        [cluster
            clearHolidayScheduleWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clear Holiday schedule with 0 index Error: %@", err);

                                    VerifyOrReturn(CheckValue("status",
                                        err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                      : EMBER_ZCL_STATUS_FAILURE)
                                            : 0,
                                        EMBER_ZCL_STATUS_INVALID_COMMAND));
                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearHolidayScheduleWithOutOfBoundsIndex_68()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:[NumberOfYearDaySchedulesSupportedPerUser unsignedCharValue] + 1U];
        [cluster
            clearHolidayScheduleWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clear Holiday schedule with out-of-bounds index Error: %@", err);

                                    VerifyOrReturn(CheckValue("status",
                                        err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                      : EMBER_ZCL_STATUS_FAILURE)
                                            : 0,
                                        EMBER_ZCL_STATUS_INVALID_COMMAND));
                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatWeekDayScheduleWasNotDeleted_69()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getWeekDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure that week day schedule was not deleted Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.weekDayIndex;
                                           VerifyOrReturn(CheckValue("WeekDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.daysMask;
                                           VerifyOrReturn(CheckValue("DaysMask", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.startHour;
                                           VerifyOrReturn(CheckValue("StartHour", actualValue, 15U));
                                       }

                                       {
                                           id actualValue = values.startMinute;
                                           VerifyOrReturn(CheckValue("StartMinute", actualValue, 16U));
                                       }

                                       {
                                           id actualValue = values.endHour;
                                           VerifyOrReturn(CheckValue("EndHour", actualValue, 18U));
                                       }

                                       {
                                           id actualValue = values.endMinute;
                                           VerifyOrReturn(CheckValue("EndMinute", actualValue, 0U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatYearDayScheduleWasNotDeleted_70()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure that year day schedule was not deleted Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("YearDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.localStartTime;
                                           VerifyOrReturn(CheckValue("LocalStartTime", actualValue, 12345UL));
                                       }

                                       {
                                           id actualValue = values.localEndTime;
                                           VerifyOrReturn(CheckValue("LocalEndTime", actualValue, 12345689UL));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatHolidayScheduleWasNotDeleted_71()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:1U];
        [cluster getHolidayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetHolidayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure that holiday schedule was not deleted Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.holidayIndex;
                                           VerifyOrReturn(CheckValue("HolidayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.localStartTime;
                                           VerifyOrReturn(CheckValue("LocalStartTime", actualValue, 12345UL));
                                       }

                                       {
                                           id actualValue = values.localEndTime;
                                           VerifyOrReturn(CheckValue("LocalEndTime", actualValue, 12345689UL));
                                       }

                                       {
                                           id actualValue = values.operatingMode;
                                           VerifyOrReturn(CheckValue("OperatingMode", actualValue, 0U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateAnotherWeekDayScheduleWithValidParameters_72()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:2U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.daysMask = [NSNumber numberWithUnsignedChar:2U];
        params.startHour = [NSNumber numberWithUnsignedChar:0U];
        params.startMinute = [NSNumber numberWithUnsignedChar:0U];
        params.endHour = [NSNumber numberWithUnsignedChar:23U];
        params.endMinute = [NSNumber numberWithUnsignedChar:59U];
        [cluster setWeekDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create another Week Day schedule with valid parameters Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyCreatedWeekDaySchedule_73()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:2U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getWeekDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Verify created week day schedule Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.weekDayIndex;
                                           VerifyOrReturn(CheckValue("WeekDayIndex", actualValue, 2U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.daysMask;
                                           VerifyOrReturn(CheckValue("DaysMask", actualValue, 2U));
                                       }

                                       {
                                           id actualValue = values.startHour;
                                           VerifyOrReturn(CheckValue("StartHour", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.startMinute;
                                           VerifyOrReturn(CheckValue("StartMinute", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.endHour;
                                           VerifyOrReturn(CheckValue("EndHour", actualValue, 23U));
                                       }

                                       {
                                           id actualValue = values.endMinute;
                                           VerifyOrReturn(CheckValue("EndMinute", actualValue, 59U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateAnotherYearDayScheduleWithValidParameters_74()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:2U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.localStartTime = [NSNumber numberWithUnsignedInt:9000UL];
        params.localEndTime = [NSNumber numberWithUnsignedInt:888888888UL];
        [cluster setYearDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create another Year Day schedule with valid parameters Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyCreatedYearDaySchedule_75()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:2U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Verify created year day schedule Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("YearDayIndex", actualValue, 2U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.localStartTime;
                                           VerifyOrReturn(CheckValue("LocalStartTime", actualValue, 9000UL));
                                       }

                                       {
                                           id actualValue = values.localEndTime;
                                           VerifyOrReturn(CheckValue("LocalEndTime", actualValue, 888888888UL));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateAnotherHolidayScheduleWithValidParameters_76()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:2U];
        params.localStartTime = [NSNumber numberWithUnsignedInt:123456UL];
        params.localEndTime = [NSNumber numberWithUnsignedInt:1234567UL];
        params.operatingMode = [NSNumber numberWithUnsignedChar:1U];
        [cluster setHolidayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create another Holiday schedule with valid parameters Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyCreatedHolidaySchedule_77()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:2U];
        [cluster getHolidayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetHolidayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Verify created holiday schedule Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.holidayIndex;
                                           VerifyOrReturn(CheckValue("HolidayIndex", actualValue, 2U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.localStartTime;
                                           VerifyOrReturn(CheckValue("LocalStartTime", actualValue, 123456UL));
                                       }

                                       {
                                           id actualValue = values.localEndTime;
                                           VerifyOrReturn(CheckValue("LocalEndTime", actualValue, 1234567UL));
                                       }

                                       {
                                           id actualValue = values.operatingMode;
                                           VerifyOrReturn(CheckValue("OperatingMode", actualValue, 1U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearASingleWeekDayScheduleForTheFirstUser_78()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster clearWeekDayScheduleWithParams:params
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Clear a single week day schedule for the first user Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyClearedWeekDaySchedule_79()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getWeekDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Verify cleared week day schedule Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.weekDayIndex;
                                           VerifyOrReturn(CheckValue("WeekDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 139U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearAllRemainingWeekDaySchedulesForTheFirstUser_80()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:254U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster clearWeekDayScheduleWithParams:params
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Clear all remaining week day schedules for the first user Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyClearedWeekSchedule_81()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:2U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getWeekDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Verify cleared week schedule Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.weekDayIndex;
                                           VerifyOrReturn(CheckValue("WeekDayIndex", actualValue, 2U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 139U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatFirstYearDayScheduleWasNotDeleted_82()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure that first year day schedule was not deleted Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("YearDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.localStartTime;
                                           VerifyOrReturn(CheckValue("LocalStartTime", actualValue, 12345UL));
                                       }

                                       {
                                           id actualValue = values.localEndTime;
                                           VerifyOrReturn(CheckValue("LocalEndTime", actualValue, 12345689UL));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatSecondYearDayScheduleWasNotDeleted_83()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:2U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure that second year day schedule was not deleted Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("YearDayIndex", actualValue, 2U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.localStartTime;
                                           VerifyOrReturn(CheckValue("LocalStartTime", actualValue, 9000UL));
                                       }

                                       {
                                           id actualValue = values.localEndTime;
                                           VerifyOrReturn(CheckValue("LocalEndTime", actualValue, 888888888UL));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatFirstHolidayScheduleWasNotDeleted_84()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:1U];
        [cluster getHolidayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetHolidayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure that first holiday schedule was not deleted Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.holidayIndex;
                                           VerifyOrReturn(CheckValue("HolidayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.localStartTime;
                                           VerifyOrReturn(CheckValue("LocalStartTime", actualValue, 12345UL));
                                       }

                                       {
                                           id actualValue = values.localEndTime;
                                           VerifyOrReturn(CheckValue("LocalEndTime", actualValue, 12345689UL));
                                       }

                                       {
                                           id actualValue = values.operatingMode;
                                           VerifyOrReturn(CheckValue("OperatingMode", actualValue, 0U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatSecondHolidayScheduleWasNotDeleted_85()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:2U];
        [cluster getHolidayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetHolidayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure that second holiday schedule was not deleted Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.holidayIndex;
                                           VerifyOrReturn(CheckValue("HolidayIndex", actualValue, 2U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.localStartTime;
                                           VerifyOrReturn(CheckValue("LocalStartTime", actualValue, 123456UL));
                                       }

                                       {
                                           id actualValue = values.localEndTime;
                                           VerifyOrReturn(CheckValue("LocalEndTime", actualValue, 1234567UL));
                                       }

                                       {
                                           id actualValue = values.operatingMode;
                                           VerifyOrReturn(CheckValue("OperatingMode", actualValue, 1U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateAnotherWeekDayScheduleWithValidParameters_86()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.daysMask = [NSNumber numberWithUnsignedChar:2U];
        params.startHour = [NSNumber numberWithUnsignedChar:0U];
        params.startMinute = [NSNumber numberWithUnsignedChar:0U];
        params.endHour = [NSNumber numberWithUnsignedChar:23U];
        params.endMinute = [NSNumber numberWithUnsignedChar:59U];
        [cluster setWeekDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create another Week Day schedule with valid parameters Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearASingleYearDayScheduleForTheFirstUser_87()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster clearYearDayScheduleWithParams:params
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Clear a single year day schedule for the first user Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyClearedYearDaySchedule_88()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Verify cleared year day schedule Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("YearDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 139U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearAllRemainingYearSchedulesForTheFirstUser_89()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:254U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster clearYearDayScheduleWithParams:params
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Clear all remaining year schedules for the first user Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatSecondYearDayScheduleWasCleared_90()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:2U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Verify that second year day schedule was cleared Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("YearDayIndex", actualValue, 2U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 139U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyCreatedWeekDaySchedule_91()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getWeekDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Verify created week day schedule Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.weekDayIndex;
                                           VerifyOrReturn(CheckValue("WeekDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.daysMask;
                                           VerifyOrReturn(CheckValue("DaysMask", actualValue, 2U));
                                       }

                                       {
                                           id actualValue = values.startHour;
                                           VerifyOrReturn(CheckValue("StartHour", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.startMinute;
                                           VerifyOrReturn(CheckValue("StartMinute", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.endHour;
                                           VerifyOrReturn(CheckValue("EndHour", actualValue, 23U));
                                       }

                                       {
                                           id actualValue = values.endMinute;
                                           VerifyOrReturn(CheckValue("EndMinute", actualValue, 59U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearAllRemainingWeekDaySchedulesForTheFirstUser_92()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:254U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster clearWeekDayScheduleWithParams:params
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Clear all remaining week day schedules for the first user Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewUserWithoutCredentialSoWeCanAddMoreSchedulesToIt_93()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:2U];
        params.userName = nil;
        params.userUniqueID = nil;
        params.userStatus = nil;
        params.userType = nil;
        params.credentialRule = nil;
        [cluster setUserWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"Create new user without credential so we can add more schedules to it Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleWithValidParametersForFirstUser_94()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.daysMask = [NSNumber numberWithUnsignedChar:1U];
        params.startHour = [NSNumber numberWithUnsignedChar:0U];
        params.startMinute = [NSNumber numberWithUnsignedChar:0U];
        params.endHour = [NSNumber numberWithUnsignedChar:23U];
        params.endMinute = [NSNumber numberWithUnsignedChar:59U];
        [cluster setWeekDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Week Day schedule with valid parameters for first user Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyCreatedWeekDayScheduleForFirstUser_95()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getWeekDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Verify created week day schedule for first user Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.weekDayIndex;
                                           VerifyOrReturn(CheckValue("WeekDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.daysMask;
                                           VerifyOrReturn(CheckValue("DaysMask", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.startHour;
                                           VerifyOrReturn(CheckValue("StartHour", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.startMinute;
                                           VerifyOrReturn(CheckValue("StartMinute", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.endHour;
                                           VerifyOrReturn(CheckValue("EndHour", actualValue, 23U));
                                       }

                                       {
                                           id actualValue = values.endMinute;
                                           VerifyOrReturn(CheckValue("EndMinute", actualValue, 59U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateYearDayScheduleForFirstUser_96()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:4U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.localStartTime = [NSNumber numberWithUnsignedInt:9000UL];
        params.localEndTime = [NSNumber numberWithUnsignedInt:888888888UL];
        [cluster setYearDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Year Day schedule for first user Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyCreatedYearDayScheduleForFirst_97()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:4U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Verify created year day schedule for first Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("YearDayIndex", actualValue, 4U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.localStartTime;
                                           VerifyOrReturn(CheckValue("LocalStartTime", actualValue, 9000UL));
                                       }

                                       {
                                           id actualValue = values.localEndTime;
                                           VerifyOrReturn(CheckValue("LocalEndTime", actualValue, 888888888UL));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleWithValidParametersForSecondUser_98()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:4U];
        params.userIndex = [NSNumber numberWithUnsignedShort:2U];
        params.daysMask = [NSNumber numberWithUnsignedChar:64U];
        params.startHour = [NSNumber numberWithUnsignedChar:23U];
        params.startMinute = [NSNumber numberWithUnsignedChar:0U];
        params.endHour = [NSNumber numberWithUnsignedChar:23U];
        params.endMinute = [NSNumber numberWithUnsignedChar:59U];
        [cluster setWeekDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Week Day schedule with valid parameters for second user Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyCreatedWeekDayScheduleForFirstUser_99()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:4U];
        params.userIndex = [NSNumber numberWithUnsignedShort:2U];
        [cluster getWeekDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Verify created week day schedule for first user Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.weekDayIndex;
                                           VerifyOrReturn(CheckValue("WeekDayIndex", actualValue, 4U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("UserIndex", actualValue, 2U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.daysMask;
                                           VerifyOrReturn(CheckValue("DaysMask", actualValue, 64U));
                                       }

                                       {
                                           id actualValue = values.startHour;
                                           VerifyOrReturn(CheckValue("StartHour", actualValue, 23U));
                                       }

                                       {
                                           id actualValue = values.startMinute;
                                           VerifyOrReturn(CheckValue("StartMinute", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.endHour;
                                           VerifyOrReturn(CheckValue("EndHour", actualValue, 23U));
                                       }

                                       {
                                           id actualValue = values.endMinute;
                                           VerifyOrReturn(CheckValue("EndMinute", actualValue, 59U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateYearDayScheduleForSecondUser_100()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.localStartTime = [NSNumber numberWithUnsignedInt:55555UL];
        params.localEndTime = [NSNumber numberWithUnsignedInt:7777777UL];
        [cluster setYearDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Year Day schedule for second user Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyCreatedYearDayScheduleForFirst_101()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Verify created year day schedule for first Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("YearDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.localStartTime;
                                           VerifyOrReturn(CheckValue("LocalStartTime", actualValue, 55555UL));
                                       }

                                       {
                                           id actualValue = values.localEndTime;
                                           VerifyOrReturn(CheckValue("LocalEndTime", actualValue, 7777777UL));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCleanupTheUser_102()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:65534U];
        [cluster clearUserWithParams:params
                          completion:^(NSError * _Nullable err) {
                              NSLog(@"Cleanup the user Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureClearingFirstUserAlsoClearedWeekDaySchedules_103()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getWeekDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure clearing first user also cleared week day schedules Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.weekDayIndex;
                                           VerifyOrReturn(CheckValue("WeekDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 1U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureClearingFirstUserAlsoClearedYearDaySchedules_104()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:4U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure clearing first user also cleared year day schedules Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("YearDayIndex", actualValue, 4U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 1U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureClearingSecondUserAlsoClearedWeekDaySchedules_105()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:4U];
        params.userIndex = [NSNumber numberWithUnsignedShort:2U];
        [cluster getWeekDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure clearing second user also cleared week day schedules Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.weekDayIndex;
                                           VerifyOrReturn(CheckValue("WeekDayIndex", actualValue, 4U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("UserIndex", actualValue, 2U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 1U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureClearingSecondUserAlsoClearedYearDaySchedules_106()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:2U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure clearing second user also cleared year day schedules Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("YearDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("UserIndex", actualValue, 2U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 1U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatFirstHolidayScheduleWasNotDeleted_107()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:1U];
        [cluster getHolidayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetHolidayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure that first holiday schedule was not deleted Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.holidayIndex;
                                           VerifyOrReturn(CheckValue("HolidayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.localStartTime;
                                           VerifyOrReturn(CheckValue("LocalStartTime", actualValue, 12345UL));
                                       }

                                       {
                                           id actualValue = values.localEndTime;
                                           VerifyOrReturn(CheckValue("LocalEndTime", actualValue, 12345689UL));
                                       }

                                       {
                                           id actualValue = values.operatingMode;
                                           VerifyOrReturn(CheckValue("OperatingMode", actualValue, 0U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatSecondHolidayScheduleWasNotDeleted_108()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:2U];
        [cluster getHolidayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetHolidayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure that second holiday schedule was not deleted Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.holidayIndex;
                                           VerifyOrReturn(CheckValue("HolidayIndex", actualValue, 2U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.localStartTime;
                                           VerifyOrReturn(CheckValue("LocalStartTime", actualValue, 123456UL));
                                       }

                                       {
                                           id actualValue = values.localEndTime;
                                           VerifyOrReturn(CheckValue("LocalEndTime", actualValue, 1234567UL));
                                       }

                                       {
                                           id actualValue = values.operatingMode;
                                           VerifyOrReturn(CheckValue("OperatingMode", actualValue, 1U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateAnotherHolidayScheduleAtTheLastSlot_109()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NumberOfHolidaySchedulesSupported copy];
        params.localStartTime = [NSNumber numberWithUnsignedInt:1UL];
        params.localEndTime = [NSNumber numberWithUnsignedInt:100UL];
        params.operatingMode = [NSNumber numberWithUnsignedChar:4U];
        [cluster setHolidayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create another Holiday schedule at the last slot Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyCreatedHolidaySchedule_110()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NumberOfHolidaySchedulesSupported copy];
        [cluster
            getHolidayScheduleWithParams:params
                              completion:^(
                                  MTRDoorLockClusterGetHolidayScheduleResponseParams * _Nullable values, NSError * _Nullable err) {
                                  NSLog(@"Verify Created Holiday Schedule Error: %@", err);

                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                  {
                                      id actualValue = values.holidayIndex;
                                      VerifyOrReturn(CheckValue("HolidayIndex", actualValue, NumberOfHolidaySchedulesSupported));
                                  }

                                  {
                                      id actualValue = values.status;
                                      VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                                  }

                                  {
                                      id actualValue = values.localStartTime;
                                      VerifyOrReturn(CheckValue("LocalStartTime", actualValue, 1UL));
                                  }

                                  {
                                      id actualValue = values.localEndTime;
                                      VerifyOrReturn(CheckValue("LocalEndTime", actualValue, 100UL));
                                  }

                                  {
                                      id actualValue = values.operatingMode;
                                      VerifyOrReturn(CheckValue("OperatingMode", actualValue, 4U));
                                  }

                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewPinCredentialAndScheduleUser_111()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        params.credentialData = [[NSData alloc] initWithBytes:"123456" length:6];
        params.userIndex = nil;
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new PIN credential and schedule user Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNonNull("UserIndex", actualValue));
                                 VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("NextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("NextCredentialIndex", actualValue, 2U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleForFirstUser_112()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.daysMask = [NSNumber numberWithUnsignedChar:1U];
        params.startHour = [NSNumber numberWithUnsignedChar:0U];
        params.startMinute = [NSNumber numberWithUnsignedChar:0U];
        params.endHour = [NSNumber numberWithUnsignedChar:23U];
        params.endMinute = [NSNumber numberWithUnsignedChar:59U];
        [cluster setWeekDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Week Day schedule for first user Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateYearDayScheduleForFirstUser_113()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.localStartTime = [NSNumber numberWithUnsignedInt:9000UL];
        params.localEndTime = [NSNumber numberWithUnsignedInt:888888888UL];
        [cluster setYearDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Year Day schedule for first user Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearASingleHolidaySchedule_114()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:2U];
        [cluster clearHolidayScheduleWithParams:params
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Clear a single holiday schedule Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatFirstHolidayScheduleWasNotDeleted_115()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:1U];
        [cluster getHolidayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetHolidayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure that first holiday schedule was not deleted Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.holidayIndex;
                                           VerifyOrReturn(CheckValue("HolidayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.localStartTime;
                                           VerifyOrReturn(CheckValue("LocalStartTime", actualValue, 12345UL));
                                       }

                                       {
                                           id actualValue = values.localEndTime;
                                           VerifyOrReturn(CheckValue("LocalEndTime", actualValue, 12345689UL));
                                       }

                                       {
                                           id actualValue = values.operatingMode;
                                           VerifyOrReturn(CheckValue("OperatingMode", actualValue, 0U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatSecondHolidayScheduleWasDeleted_116()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:2U];
        [cluster getHolidayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetHolidayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure that second holiday schedule was deleted Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.holidayIndex;
                                           VerifyOrReturn(CheckValue("HolidayIndex", actualValue, 2U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 139U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatThirdHolidayScheduleWasNotDeleted_117()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NumberOfHolidaySchedulesSupported copy];
        [cluster
            getHolidayScheduleWithParams:params
                              completion:^(
                                  MTRDoorLockClusterGetHolidayScheduleResponseParams * _Nullable values, NSError * _Nullable err) {
                                  NSLog(@"Make sure that third holiday schedule was not deleted Error: %@", err);

                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                  {
                                      id actualValue = values.holidayIndex;
                                      VerifyOrReturn(CheckValue("HolidayIndex", actualValue, NumberOfHolidaySchedulesSupported));
                                  }

                                  {
                                      id actualValue = values.status;
                                      VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                                  }

                                  {
                                      id actualValue = values.localStartTime;
                                      VerifyOrReturn(CheckValue("LocalStartTime", actualValue, 1UL));
                                  }

                                  {
                                      id actualValue = values.localEndTime;
                                      VerifyOrReturn(CheckValue("LocalEndTime", actualValue, 100UL));
                                  }

                                  {
                                      id actualValue = values.operatingMode;
                                      VerifyOrReturn(CheckValue("OperatingMode", actualValue, 4U));
                                  }

                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureClearingHolidayScheduleDidNotClearWeekDaySchedule_118()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getWeekDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure clearing holiday schedule did not clear week day schedule Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.weekDayIndex;
                                           VerifyOrReturn(CheckValue("WeekDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.daysMask;
                                           VerifyOrReturn(CheckValue("DaysMask", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.startHour;
                                           VerifyOrReturn(CheckValue("StartHour", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.startMinute;
                                           VerifyOrReturn(CheckValue("StartMinute", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.endHour;
                                           VerifyOrReturn(CheckValue("EndHour", actualValue, 23U));
                                       }

                                       {
                                           id actualValue = values.endMinute;
                                           VerifyOrReturn(CheckValue("EndMinute", actualValue, 59U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureClearingHolidayScheduleDidNotClearYearDaySchedule_119()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure clearing holiday schedule did not clear year day schedule Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("YearDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.localStartTime;
                                           VerifyOrReturn(CheckValue("LocalStartTime", actualValue, 9000UL));
                                       }

                                       {
                                           id actualValue = values.localEndTime;
                                           VerifyOrReturn(CheckValue("LocalEndTime", actualValue, 888888888UL));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearAllRemainingHolidaySchedules_120()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:254U];
        [cluster clearHolidayScheduleWithParams:params
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Clear all remaining holiday schedules Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatFirstHolidayIsStillDeleted_121()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:1U];
        [cluster getHolidayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetHolidayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure that first holiday is still deleted Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.holidayIndex;
                                           VerifyOrReturn(CheckValue("HolidayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 139U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatSecondHolidayScheduleWasDeleted_122()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:2U];
        [cluster getHolidayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetHolidayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure that second holiday schedule was deleted Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.holidayIndex;
                                           VerifyOrReturn(CheckValue("HolidayIndex", actualValue, 2U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 139U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatThirdHolidayScheduleWasNotDeleted_123()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NumberOfHolidaySchedulesSupported copy];
        [cluster
            getHolidayScheduleWithParams:params
                              completion:^(
                                  MTRDoorLockClusterGetHolidayScheduleResponseParams * _Nullable values, NSError * _Nullable err) {
                                  NSLog(@"Make sure that third holiday schedule was not deleted Error: %@", err);

                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                  {
                                      id actualValue = values.holidayIndex;
                                      VerifyOrReturn(CheckValue("HolidayIndex", actualValue, NumberOfHolidaySchedulesSupported));
                                  }

                                  {
                                      id actualValue = values.status;
                                      VerifyOrReturn(CheckValue("Status", actualValue, 139U));
                                  }

                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureClearingHolidayScheduleDidNotClearWeekDaySchedule_124()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getWeekDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure clearing holiday schedule did not clear week day schedule Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.weekDayIndex;
                                           VerifyOrReturn(CheckValue("WeekDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.daysMask;
                                           VerifyOrReturn(CheckValue("DaysMask", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.startHour;
                                           VerifyOrReturn(CheckValue("StartHour", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.startMinute;
                                           VerifyOrReturn(CheckValue("StartMinute", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.endHour;
                                           VerifyOrReturn(CheckValue("EndHour", actualValue, 23U));
                                       }

                                       {
                                           id actualValue = values.endMinute;
                                           VerifyOrReturn(CheckValue("EndMinute", actualValue, 59U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureClearingHolidayScheduleDidNotClearYearDaySchedule_125()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure clearing holiday schedule did not clear year day schedule Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("YearDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.localStartTime;
                                           VerifyOrReturn(CheckValue("LocalStartTime", actualValue, 9000UL));
                                       }

                                       {
                                           id actualValue = values.localEndTime;
                                           VerifyOrReturn(CheckValue("LocalEndTime", actualValue, 888888888UL));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestFinalCleanup_126()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:65534U];
        [cluster clearUserWithParams:params
                          completion:^(NSError * _Nullable err) {
                              NSLog(@"Final Cleanup Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_DRLK_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_DRLK_1_1()
        : TestCommandBridge("Test_TC_DRLK_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_DRLK_1_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_DRLK_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_DRLK_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads the ClusterRevision from DUT\n");
            err = TestThReadsTheClusterRevisionFromDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads the FeatureMap from DUT\n");
            if (ShouldSkip(" !DRLK.S.F00 && !DRLK.S.F01 && !DRLK.S.F02 && !DRLK.S.F04 && !DRLK.S.F05 && !DRLK.S.F06 && !DRLK.S.F07 "
                           "&& !DRLK.S.F08 && !DRLK.S.F0a && !DRLK.S.F0b ")) {
                NextTest();
                return;
            }
            err = TestThReadsTheFeatureMapFromDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Given DRLK.S.F00(PIN) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("DRLK.S.F00")) {
                NextTest();
                return;
            }
            err = TestGivenDrlksf00pinEnsureFeaturemapHasTheCorrectBitSet_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Given DRLK.S.F01(RID) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("DRLK.S.F01")) {
                NextTest();
                return;
            }
            err = TestGivenDrlksf01ridEnsureFeaturemapHasTheCorrectBitSet_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Given DRLK.S.F02(FGP) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("DRLK.S.F02")) {
                NextTest();
                return;
            }
            err = TestGivenDrlksf02fgpEnsureFeaturemapHasTheCorrectBitSet_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Given DRLK.S.F04(WDSCH) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("DRLK.S.F04")) {
                NextTest();
                return;
            }
            err = TestGivenDrlksf04wdschEnsureFeaturemapHasTheCorrectBitSet_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Given DRLK.S.F05(DPS) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("DRLK.S.F05")) {
                NextTest();
                return;
            }
            err = TestGivenDrlksf05dpsEnsureFeaturemapHasTheCorrectBitSet_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Given DRLK.S.F06(FACE) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("DRLK.S.F06")) {
                NextTest();
                return;
            }
            err = TestGivenDrlksf06faceEnsureFeaturemapHasTheCorrectBitSet_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Given DRLK.S.F07(COTA) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("DRLK.S.F07")) {
                NextTest();
                return;
            }
            err = TestGivenDrlksf07cotaEnsureFeaturemapHasTheCorrectBitSet_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Given DRLK.S.F08(USR) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("DRLK.S.F08")) {
                NextTest();
                return;
            }
            err = TestGivenDrlksf08usrEnsureFeaturemapHasTheCorrectBitSet_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Given DRLK.S.F0a(YDSCH) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("DRLK.S.F0a")) {
                NextTest();
                return;
            }
            err = TestGivenDRLKSF0aYDSCHEnsureFeaturemapHasTheCorrectBitSet_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Given DRLK.S.F0b(HDSCH) ensure featuremap has the correct bit set\n");
            if (ShouldSkip("DRLK.S.F0b")) {
                NextTest();
                return;
            }
            err = TestGivenDRLKSF0bHDSCHEnsureFeaturemapHasTheCorrectBitSet_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : TH reads AttributeList from DUT\n");
            err = TestThReadsAttributeListFromDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : TH reads Feature dependent(DRLK.S.F05) attributes in AttributeList\n");
            if (ShouldSkip("DRLK.S.F05")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentDRLKSF05AttributesInAttributeList_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : TH reads Feature dependent(DRLK.S.F08) attributes in AttributeList\n");
            if (ShouldSkip("DRLK.S.F08")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentDRLKSF08AttributesInAttributeList_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : TH reads Feature dependent(DRLK.S.F00) attributes in AttributeList\n");
            if (ShouldSkip("DRLK.S.F00")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentDRLKSF00AttributesInAttributeList_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : TH reads Feature dependent(DRLK.S.F01) attributes in AttributeList\n");
            if (ShouldSkip("DRLK.S.F01")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentDRLKSF01AttributesInAttributeList_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : TH reads Feature dependent(DRLK.S.F04) attribute in AttributeList\n");
            if (ShouldSkip("DRLK.S.F04")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentDRLKSF04AttributeInAttributeList_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : TH reads Feature dependent(DRLK.S.F0a) attribute in AttributeList\n");
            if (ShouldSkip("DRLK.S.F0a")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentDRLKSF0aAttributeInAttributeList_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : TH reads Feature dependent(DRLK.S.F0b) attribute in AttributeList\n");
            if (ShouldSkip("DRLK.S.F0b")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentDRLKSF0bAttributeInAttributeList_20();
            break;
        case 21:
            ChipLogProgress(chipTool,
                " ***** Test Step 21 : TH reads Feature dependent(DRLK.S.F00 or DRLK.S.F01) attributes in AttributeList\n");
            if (ShouldSkip("DRLK.S.F00 || DRLK.S.F01")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentDRLKSF00OrDrlksf01AttributesInAttributeList_21();
            break;
        case 22:
            ChipLogProgress(chipTool,
                " ***** Test Step 22 : TH reads Feature dependent(DRLK.S.F07 or DRLK.S.F00) attribute in AttributeList\n");
            if (ShouldSkip("DRLK.S.F07 || DRLK.S.F00")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentDRLKSF07OrDrlksf00AttributeInAttributeList_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : TH reads optional attribute(Language) in AttributeList\n");
            if (ShouldSkip("DRLK.S.A0021")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeLanguageInAttributeList_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : TH reads optional attribute(LEDSettings) in AttributeList\n");
            if (ShouldSkip("DRLK.S.A0022")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeLEDSettingsInAttributeList_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : TH reads optional attribute(AutoRelockTime) in AttributeList\n");
            if (ShouldSkip("DRLK.S.A0023")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeAutoRelockTimeInAttributeList_25();
            break;
        case 26:
            ChipLogProgress(chipTool, " ***** Test Step 26 : TH reads optional attribute(SoundVolume) in AttributeList\n");
            if (ShouldSkip("DRLK.S.A0024")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeSoundVolumeInAttributeList_26();
            break;
        case 27:
            ChipLogProgress(
                chipTool, " ***** Test Step 27 : TH reads optional attribute(DefaultConfigurationRegister) in AttributeList\n");
            if (ShouldSkip("DRLK.S.A0027")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeDefaultConfigurationRegisterInAttributeList_27();
            break;
        case 28:
            ChipLogProgress(
                chipTool, " ***** Test Step 28 : TH reads optional attribute(EnableLocalProgramming) in AttributeList\n");
            if (ShouldSkip("DRLK.S.A0028")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeEnableLocalProgrammingInAttributeList_28();
            break;
        case 29:
            ChipLogProgress(
                chipTool, " ***** Test Step 29 : TH reads optional attribute(EnableOneTouchLocking) in AttributeList\n");
            if (ShouldSkip("DRLK.S.A0029")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeEnableOneTouchLockingInAttributeList_29();
            break;
        case 30:
            ChipLogProgress(
                chipTool, " ***** Test Step 30 : TH reads optional attribute(EnableInsideStatusLED) in AttributeList\n");
            if (ShouldSkip("DRLK.S.A002a")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeEnableInsideStatusLEDInAttributeList_30();
            break;
        case 31:
            ChipLogProgress(
                chipTool, " ***** Test Step 31 : TH reads optional attribute(EnablePrivacyModeButton) in AttributeList\n");
            if (ShouldSkip("DRLK.S.A002b")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeEnablePrivacyModeButtonInAttributeList_31();
            break;
        case 32:
            ChipLogProgress(
                chipTool, " ***** Test Step 32 : TH reads optional attribute(LocalProgrammingFeatures) in AttributeList\n");
            if (ShouldSkip("DRLK.S.A002c")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeLocalProgrammingFeaturesInAttributeList_32();
            break;
        case 33:
            ChipLogProgress(chipTool, " ***** Test Step 33 : TH reads AcceptedCommandList from DUT\n");
            err = TestThReadsAcceptedCommandListFromDut_33();
            break;
        case 34:
            ChipLogProgress(
                chipTool, " ***** Test Step 34 : TH reads Feature dependent commands(DRLK.S.F04) in AcceptedCommandList\n");
            if (ShouldSkip("DRLK.S.F04")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentCommandsDRLKSF04InAcceptedCommandList_34();
            break;
        case 35:
            ChipLogProgress(
                chipTool, " ***** Test Step 35 : TH reads Feature dependent commands(DRLK.S.F0a) in AcceptedCommandList\n");
            if (ShouldSkip("DRLK.S.F0a")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentCommandsDRLKSF0aInAcceptedCommandList_35();
            break;
        case 36:
            ChipLogProgress(
                chipTool, " ***** Test Step 36 : TH reads Feature dependent commands(DRLK.S.F0b) in AcceptedCommandList\n");
            if (ShouldSkip("DRLK.S.F0b")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentCommandsDRLKSF0bInAcceptedCommandList_36();
            break;
        case 37:
            ChipLogProgress(
                chipTool, " ***** Test Step 37 : TH reads Feature dependent commands(DRLK.S.F08) in AcceptedCommandList\n");
            if (ShouldSkip("DRLK.S.F08")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentCommandsDRLKSF08InAcceptedCommandList_37();
            break;
        case 38:
            ChipLogProgress(chipTool, " ***** Test Step 38 : TH reads optional commands(DRLK.S.C03.Rsp) in AcceptedCommandList\n");
            if (ShouldSkip("DRLK.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalCommandsDRLKSC03RspInAcceptedCommandList_38();
            break;
        case 39:
            ChipLogProgress(
                chipTool, " ***** Test Step 39 : TH reads Feature dependent command(DRLK.S.F04) in GeneratedCommandList\n");
            if (ShouldSkip("DRLK.S.F04")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentCommandDRLKSF04InGeneratedCommandList_39();
            break;
        case 40:
            ChipLogProgress(
                chipTool, " ***** Test Step 40 : TH reads Feature dependent command(DRLK.S.F0a) in GeneratedCommandList\n");
            if (ShouldSkip("DRLK.S.F0a")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentCommandDRLKSF0aInGeneratedCommandList_40();
            break;
        case 41:
            ChipLogProgress(
                chipTool, " ***** Test Step 41 : TH reads Feature dependent command(DRLK.S.F0b) in GeneratedCommandList\n");
            if (ShouldSkip("DRLK.S.F0b")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentCommandDRLKSF0bInGeneratedCommandList_41();
            break;
        case 42:
            ChipLogProgress(
                chipTool, " ***** Test Step 42 : TH reads Feature dependent command(DRLK.S.F08) in GeneratedCommandList\n");
            if (ShouldSkip("DRLK.S.F08")) {
                NextTest();
                return;
            }
            err = TestThReadsFeatureDependentCommandDRLKSF08InGeneratedCommandList_42();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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));
            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));
            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));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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));
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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));
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 43;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheClusterRevisionFromDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the ClusterRevision from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 6U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheFeatureMapFromDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the FeatureMap from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenDrlksf00pinEnsureFeaturemapHasTheCorrectBitSet_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given DRLK.S.F00(PIN) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenDrlksf01ridEnsureFeaturemapHasTheCorrectBitSet_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given DRLK.S.F01(RID) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenDrlksf02fgpEnsureFeaturemapHasTheCorrectBitSet_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given DRLK.S.F02(FGP) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenDrlksf04wdschEnsureFeaturemapHasTheCorrectBitSet_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given DRLK.S.F04(WDSCH) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenDrlksf05dpsEnsureFeaturemapHasTheCorrectBitSet_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given DRLK.S.F05(DPS) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenDrlksf06faceEnsureFeaturemapHasTheCorrectBitSet_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given DRLK.S.F06(FACE) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenDrlksf07cotaEnsureFeaturemapHasTheCorrectBitSet_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given DRLK.S.F07(COTA) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenDrlksf08usrEnsureFeaturemapHasTheCorrectBitSet_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given DRLK.S.F08(USR) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenDRLKSF0aYDSCHEnsureFeaturemapHasTheCorrectBitSet_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given DRLK.S.F0a(YDSCH) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenDRLKSF0bHDSCHEnsureFeaturemapHasTheCorrectBitSet_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given DRLK.S.F0b(HDSCH) ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAttributeListFromDut_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AttributeList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 37UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 38UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentDRLKSF05AttributesInAttributeList_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent(DRLK.S.F05) attributes in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentDRLKSF08AttributesInAttributeList_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent(DRLK.S.F08) attributes in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 17UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 27UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 28UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentDRLKSF00AttributesInAttributeList_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent(DRLK.S.F00) attributes in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 18UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 23UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 24UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentDRLKSF01AttributesInAttributeList_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent(DRLK.S.F01) attributes in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 19UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 25UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 26UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentDRLKSF04AttributeInAttributeList_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent(DRLK.S.F04) attribute in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 20UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentDRLKSF0aAttributeInAttributeList_19()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent(DRLK.S.F0a) attribute in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 21UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentDRLKSF0bAttributeInAttributeList_20()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent(DRLK.S.F0b) attribute in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 22UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentDRLKSF00OrDrlksf01AttributesInAttributeList_21()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent(DRLK.S.F00 or DRLK.S.F01) attributes in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 48UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 49UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentDRLKSF07OrDrlksf00AttributeInAttributeList_22()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent(DRLK.S.F07 or DRLK.S.F00) attribute in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 51UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeLanguageInAttributeList_23()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(Language) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 33UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeLEDSettingsInAttributeList_24()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(LEDSettings) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 34UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeAutoRelockTimeInAttributeList_25()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(AutoRelockTime) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 35UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeSoundVolumeInAttributeList_26()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(SoundVolume) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 36UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeDefaultConfigurationRegisterInAttributeList_27()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(DefaultConfigurationRegister) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 39UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeEnableLocalProgrammingInAttributeList_28()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(EnableLocalProgramming) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 40UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeEnableOneTouchLockingInAttributeList_29()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(EnableOneTouchLocking) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 41UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeEnableInsideStatusLEDInAttributeList_30()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(EnableInsideStatusLED) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 42UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeEnablePrivacyModeButtonInAttributeList_31()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(EnablePrivacyModeButton) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 43UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeLocalProgrammingFeaturesInAttributeList_32()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional attribute(LocalProgrammingFeatures) in AttributeList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 44UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAcceptedCommandListFromDut_33()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AcceptedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 1UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentCommandsDRLKSF04InAcceptedCommandList_34()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent commands(DRLK.S.F04) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 11UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 12UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 13UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentCommandsDRLKSF0aInAcceptedCommandList_35()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent commands(DRLK.S.F0a) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 14UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 15UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 16UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentCommandsDRLKSF0bInAcceptedCommandList_36()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent commands(DRLK.S.F0b) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 17UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 18UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 19UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentCommandsDRLKSF08InAcceptedCommandList_37()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent commands(DRLK.S.F08) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 26UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 27UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 29UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 34UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 36UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 38UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalCommandsDRLKSC03RspInAcceptedCommandList_38()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads optional commands(DRLK.S.C03.Rsp) in AcceptedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentCommandDRLKSF04InGeneratedCommandList_39()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent command(DRLK.S.F04) in GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 12UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentCommandDRLKSF0aInGeneratedCommandList_40()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent command(DRLK.S.F0a) in GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 15UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentCommandDRLKSF0bInGeneratedCommandList_41()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent command(DRLK.S.F0b) in GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 18UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFeatureDependentCommandDRLKSF08InGeneratedCommandList_42()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads Feature dependent command(DRLK.S.F08) in GeneratedCommandList Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 28UL));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 35UL));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 37UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_DRLK_2_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_DRLK_2_2()
        : TestCommandBridge("Test_TC_DRLK_2_2")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_DRLK_2_2() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_DRLK_2_2\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_DRLK_2_2\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Create new user\n");
            err = TestCreateNewUser_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the user back and verify its fields\n");
            err = TestReadTheUserBackAndVerifyItsFields_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Create new PIN credential and lock/unlock user\n");
            err = TestCreateNewPinCredentialAndLockUnlockUser_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Verify created PIN credential\n");
            err = TestVerifyCreatedPinCredential_4();
            break;
        case 5:
            ChipLogProgress(
                chipTool, " ***** Test Step 5 : TH writes the RequirePINforRemoteOperation attribute value as False on the DUT\n");
            if (ShouldSkip("DRLK.S.A0033")) {
                NextTest();
                return;
            }
            err = TestThWritesTheRequirePINforRemoteOperationAttributeValueAsFalseOnTheDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool,
                " ***** Test Step 6 : TH writes the RequirePINforRemoteOperation attribute value as False on the DUT and Verify "
                "DUT responds with UNSUPPORTED_WRITE\n");
            if (ShouldSkip("!DRLK.S.A0033")) {
                NextTest();
                return;
            }
            err = TestThWritesTheRequirePINforRemoteOperationAttributeValueAsFalseOnTheDutAndVerifyDutRespondsWithUnsupportedWrite_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH reads the RequirePINforRemoteOperation attribute from the DUT\n");
            if (ShouldSkip("DRLK.S.F07 && DRLK.S.F00 && DRLK.S.A0033")) {
                NextTest();
                return;
            }
            err = TestThReadsTheRequirePINforRemoteOperationAttributeFromTheDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : TH sends Lock Door Command to the DUT without PINCode\n");
            if (ShouldSkip("DRLK.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsLockDoorCommandToTheDutWithoutPINCode_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH sends Lock Door Command to the DUT with valid PINCode\n");
            if (ShouldSkip("DRLK.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsLockDoorCommandToTheDutWithValidPINCode_9();
            break;
        case 10:
            ChipLogProgress(
                chipTool, " ***** Test Step 10 : TH writes the RequirePINforRemoteOperation attribute value as False on the DUT\n");
            if (ShouldSkip("DRLK.S.A0033")) {
                NextTest();
                return;
            }
            err = TestThWritesTheRequirePINforRemoteOperationAttributeValueAsFalseOnTheDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool,
                " ***** Test Step 11 : TH writes the RequirePINforRemoteOperation attribute value as False on the DUT and Verify "
                "DUT responds with UNSUPPORTED_WRITE\n");
            if (ShouldSkip("!DRLK.S.A0033")) {
                NextTest();
                return;
            }
            err = TestThWritesTheRequirePINforRemoteOperationAttributeValueAsFalseOnTheDutAndVerifyDutRespondsWithUnsupportedWrite_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : TH reads the RequirePINforRemoteOperation attribute from the DUT\n");
            if (ShouldSkip("DRLK.S.F07 && DRLK.S.F00 && DRLK.S.A0033")) {
                NextTest();
                return;
            }
            err = TestThReadsTheRequirePINforRemoteOperationAttributeFromTheDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : TH sends Lock Door Command to the DUT with valid PINCode\n");
            if (ShouldSkip("DRLK.S.C00.Rsp && DRLK.S.A0033")) {
                NextTest();
                return;
            }
            err = TestThSendsLockDoorCommandToTheDutWithValidPINCode_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : TH sends Lock Door Command to the DUT without valid PINCode\n");
            if (ShouldSkip("DRLK.S.C00.Rsp && DRLK.S.A0033")) {
                NextTest();
                return;
            }
            err = TestThSendsLockDoorCommandToTheDutWithoutValidPINCode_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : TH sends Lock Door Command to the DUT without any argument PINCode\n");
            if (ShouldSkip("DRLK.S.C00.Rsp && DRLK.S.A0033")) {
                NextTest();
                return;
            }
            err = TestThSendsLockDoorCommandToTheDutWithoutAnyArgumentPINCode_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : TH reads the WrongCodeEntryLimit attribute from the DUT\n");
            if (ShouldSkip("DRLK.S.A0030")) {
                NextTest();
                return;
            }
            err = TestThReadsTheWrongCodeEntryLimitAttributeFromTheDut_16();
            break;
        case 17:
            ChipLogProgress(chipTool,
                " ***** Test Step 17 : TH sends an Unlock Door Command from the DUT with invalid PINCode. Repeat this step "
                "PIXIT.DRLK.WrongCodeEntryLimit times and Verify that DUT sends failure response to the TH\n");
            if (ShouldSkip("PICS_USER_PROMPT && DRLK.S.A0030")) {
                NextTest();
                return;
            }
            err = TestThSendsAnUnlockDoorCommandFromTheDutWithInvalidPINCodeRepeatThisStepPIXITDRLKWrongCodeEntryLimitTimesAndVerifyThatDutSendsFailureResponseToTheTh_17();
            break;
        case 18:
            ChipLogProgress(chipTool,
                " ***** Test Step 18 : TH sends an Unlock Door Command from User1 to the DUT with the valid PINCode and verify the "
                "DUT response\n");
            if (ShouldSkip("PICS_USER_PROMPT && DRLK.S.A0030")) {
                NextTest();
                return;
            }
            err = TestThSendsAnUnlockDoorCommandFromUser1ToTheDutWithTheValidPINCodeAndVerifyTheDutResponse_18();
            break;
        case 19:
            ChipLogProgress(chipTool,
                " ***** Test Step 19 : Wait for PIXIT.DRLK.UserCodeTemporaryDisableTime.TH then sends an Unlock Door Command from "
                "User1 to the DUT with the valid PINCode.\n");
            if (ShouldSkip("PICS_USER_PROMPT && DRLK.S.A0030")) {
                NextTest();
                return;
            }
            err = TestWaitForPIXITDRLKUserCodeTemporaryDisableTimeTHThenSendsAnUnlockDoorCommandFromUser1ToTheDutWithTheValidPINCode_19();
            break;
        case 20:
            ChipLogProgress(chipTool,
                " ***** Test Step 20 : TH writes WrongCodeEntryLimit attribute value as between 1 and 255 on the DUT and Verify "
                "that the DUT sends Success response\n");
            if (ShouldSkip("DRLK.S.A0030")) {
                NextTest();
                return;
            }
            err = TestThWritesWrongCodeEntryLimitAttributeValueAsBetween1And255OnTheDutAndVerifyThatTheDutSendsSuccessResponse_20();
            break;
        case 21:
            ChipLogProgress(chipTool,
                " ***** Test Step 21 : TH writes WrongCodeEntryLimit attribute value as between 1 and 255 on the DUT and verify "
                "DUT responds with UNSUPPORTED_WRITE\n");
            if (ShouldSkip("!DRLK.S.A0030")) {
                NextTest();
                return;
            }
            err = TestThWritesWrongCodeEntryLimitAttributeValueAsBetween1And255OnTheDutAndVerifyDutRespondsWithUnsupportedWrite_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : TH reads the UserCodeTemporaryDisableTime attribute from the DUT\n");
            if (ShouldSkip("DRLK.S.A0031")) {
                NextTest();
                return;
            }
            err = TestThReadsTheUserCodeTemporaryDisableTimeAttributeFromTheDut_22();
            break;
        case 23:
            ChipLogProgress(chipTool,
                " ***** Test Step 23 : TH writes UserCodeTemporaryDisableTime attribute value as between 1 and 255 on the DUT and "
                "Verify that the DUT sends Success response\n");
            if (ShouldSkip("DRLK.S.A0031")) {
                NextTest();
                return;
            }
            err = TestThWritesUserCodeTemporaryDisableTimeAttributeValueAsBetween1And255OnTheDutAndVerifyThatTheDutSendsSuccessResponse_23();
            break;
        case 24:
            ChipLogProgress(chipTool,
                " ***** Test Step 24 : TH writes UserCodeTemporaryDisableTime attribute value as between 1 and 255 on the DUT and "
                "verify DUT responds with UNSUPPORTED_WRITE\n");
            if (ShouldSkip("!DRLK.S.A0031")) {
                NextTest();
                return;
            }
            err = TestThWritesUserCodeTemporaryDisableTimeAttributeValueAsBetween1And255OnTheDutAndVerifyDutRespondsWithUnsupportedWrite_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : Clean the created user\n");
            err = TestCleanTheCreatedUser_25();
            break;
        case 26:
            ChipLogProgress(chipTool, " ***** Test Step 26 : Cleanup the created credential\n");
            if (ShouldSkip("DRLK.S.C26.Rsp")) {
                NextTest();
                return;
            }
            err = TestCleanupTheCreatedCredential_26();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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), 0));
            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), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            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), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 27;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestCreateNewUser_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userName = @"xxx";
        params.userUniqueID = [NSNumber numberWithUnsignedInt:6452UL];
        params.userStatus = [NSNumber numberWithUnsignedChar:1U];
        params.userType = [NSNumber numberWithUnsignedChar:0U];
        params.credentialRule = [NSNumber numberWithUnsignedChar:0U];
        [cluster setUserWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"Create new user Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheUserBackAndVerifyItsFields_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the user back and verify its fields Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNonNull("UserName", actualValue));
                                VerifyOrReturn(CheckValueAsString("UserName", actualValue, @"xxx"));
                            }

                            {
                                id actualValue = values.userUniqueID;
                                VerifyOrReturn(CheckValueNonNull("UserUniqueID", actualValue));
                                VerifyOrReturn(CheckValue("UserUniqueID", actualValue, 6452UL));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNonNull("UserStatus", actualValue));
                                VerifyOrReturn(CheckValue("UserStatus", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNonNull("UserType", actualValue));
                                VerifyOrReturn(CheckValue("UserType", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNonNull("CredentialRule", actualValue));
                                VerifyOrReturn(CheckValue("CredentialRule", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("Credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("CreatorFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("CreatorFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("LastModifiedFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("LastModifiedFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("NextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewPinCredentialAndLockUnlockUser_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        params.credentialData = [[NSData alloc] initWithBytes:"123456" length:6];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new PIN credential and lock/unlock user Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("NextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("NextCredentialIndex", actualValue, 2U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyCreatedPinCredential_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        [cluster getCredentialStatusWithParams:params
                                    completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                        NSError * _Nullable err) {
                                        NSLog(@"Verify created PIN credential Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = values.credentialExists;
                                            VerifyOrReturn(CheckValue("CredentialExists", actualValue, true));
                                        }

                                        {
                                            id actualValue = values.userIndex;
                                            VerifyOrReturn(CheckValueNonNull("UserIndex", actualValue));
                                            VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                                        }

                                        {
                                            id actualValue = values.creatorFabricIndex;
                                            VerifyOrReturn(CheckValueNonNull("CreatorFabricIndex", actualValue));
                                            VerifyOrReturn(CheckValue("CreatorFabricIndex", actualValue, 1U));
                                        }

                                        {
                                            id actualValue = values.lastModifiedFabricIndex;
                                            VerifyOrReturn(CheckValueNonNull("LastModifiedFabricIndex", actualValue));
                                            VerifyOrReturn(CheckValue("LastModifiedFabricIndex", actualValue, 1U));
                                        }

                                        {
                                            id actualValue = values.nextCredentialIndex;
                                            VerifyOrReturn(CheckValueNull("NextCredentialIndex", actualValue));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesTheRequirePINforRemoteOperationAttributeValueAsFalseOnTheDut_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id requirePINforRemoteOperationArgument;
        requirePINforRemoteOperationArgument = [NSNumber numberWithBool:false];
        [cluster writeAttributeRequirePINforRemoteOperationWithValue:requirePINforRemoteOperationArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"TH writes the RequirePINforRemoteOperation attribute value "
                                                                    @"as False on the DUT Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesTheRequirePINforRemoteOperationAttributeValueAsFalseOnTheDutAndVerifyDutRespondsWithUnsupportedWrite_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id requirePINforRemoteOperationArgument;
        requirePINforRemoteOperationArgument = [NSNumber numberWithBool:false];
        [cluster
            writeAttributeRequirePINforRemoteOperationWithValue:requirePINforRemoteOperationArgument
                                                     completion:^(NSError * _Nullable err) {
                                                         NSLog(
                                                             @"TH writes the RequirePINforRemoteOperation attribute value as False "
                                                             @"on the DUT and Verify DUT responds with UNSUPPORTED_WRITE Error: %@",
                                                             err);

                                                         VerifyOrReturn(CheckValue("status",
                                                             err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                     ? err.code
                                                                     : EMBER_ZCL_STATUS_FAILURE)
                                                                 : 0,
                                                             EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
                                                         NextTest();
                                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheRequirePINforRemoteOperationAttributeFromTheDut_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRequirePINforRemoteOperationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the RequirePINforRemoteOperation attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("RequirePINforRemoteOperation", actualValue, false));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsLockDoorCommandToTheDutWithoutPINCode_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterLockDoorParams alloc] init];
        [cluster lockDoorWithParams:params
                         completion:^(NSError * _Nullable err) {
                             NSLog(@"TH sends Lock Door Command to the DUT without PINCode Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsLockDoorCommandToTheDutWithValidPINCode_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterLockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"123456" length:6];
        [cluster lockDoorWithParams:params
                         completion:^(NSError * _Nullable err) {
                             NSLog(@"TH sends Lock Door Command to the DUT with valid PINCode Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesTheRequirePINforRemoteOperationAttributeValueAsFalseOnTheDut_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id requirePINforRemoteOperationArgument;
        requirePINforRemoteOperationArgument = [NSNumber numberWithBool:true];
        [cluster writeAttributeRequirePINforRemoteOperationWithValue:requirePINforRemoteOperationArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"TH writes the RequirePINforRemoteOperation attribute value "
                                                                    @"as False on the DUT Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesTheRequirePINforRemoteOperationAttributeValueAsFalseOnTheDutAndVerifyDutRespondsWithUnsupportedWrite_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id requirePINforRemoteOperationArgument;
        requirePINforRemoteOperationArgument = [NSNumber numberWithBool:true];
        [cluster
            writeAttributeRequirePINforRemoteOperationWithValue:requirePINforRemoteOperationArgument
                                                     completion:^(NSError * _Nullable err) {
                                                         NSLog(
                                                             @"TH writes the RequirePINforRemoteOperation attribute value as False "
                                                             @"on the DUT and Verify DUT responds with UNSUPPORTED_WRITE Error: %@",
                                                             err);

                                                         VerifyOrReturn(CheckValue("status",
                                                             err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                     ? err.code
                                                                     : EMBER_ZCL_STATUS_FAILURE)
                                                                 : 0,
                                                             EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
                                                         NextTest();
                                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheRequirePINforRemoteOperationAttributeFromTheDut_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRequirePINforRemoteOperationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the RequirePINforRemoteOperation attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("RequirePINforRemoteOperation", actualValue, true));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsLockDoorCommandToTheDutWithValidPINCode_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterLockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"123456" length:6];
        [cluster lockDoorWithParams:params
                         completion:^(NSError * _Nullable err) {
                             NSLog(@"TH sends Lock Door Command to the DUT with valid PINCode Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsLockDoorCommandToTheDutWithoutValidPINCode_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterLockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"645321" length:6];
        [cluster
            lockDoorWithParams:params
                    completion:^(NSError * _Nullable err) {
                        NSLog(@"TH sends Lock Door Command to the DUT without valid PINCode Error: %@", err);

                        VerifyOrReturn(CheckValue("status",
                            err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                : 0,
                            EMBER_ZCL_STATUS_FAILURE));
                        NextTest();
                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsLockDoorCommandToTheDutWithoutAnyArgumentPINCode_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterLockDoorParams alloc] init];
        [cluster
            lockDoorWithParams:params
                    completion:^(NSError * _Nullable err) {
                        NSLog(@"TH sends Lock Door Command to the DUT without any argument PINCode Error: %@", err);

                        VerifyOrReturn(CheckValue("status",
                            err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                : 0,
                            EMBER_ZCL_STATUS_FAILURE));
                        NextTest();
                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheWrongCodeEntryLimitAttributeFromTheDut_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeWrongCodeEntryLimitWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the WrongCodeEntryLimit attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("wrongCodeEntryLimit", [value unsignedCharValue], 1U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("wrongCodeEntryLimit", [value unsignedCharValue], 255U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestThSendsAnUnlockDoorCommandFromTheDutWithInvalidPINCodeRepeatThisStepPIXITDRLKWrongCodeEntryLimitTimesAndVerifyThatDutSendsFailureResponseToTheTh_17()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestThSendsAnUnlockDoorCommandFromUser1ToTheDutWithTheValidPINCodeAndVerifyTheDutResponse_18()
    {

        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("alpha", value);
    }

    CHIP_ERROR
    TestWaitForPIXITDRLKUserCodeTemporaryDisableTimeTHThenSendsAnUnlockDoorCommandFromUser1ToTheDutWithTheValidPINCode_19()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestThWritesWrongCodeEntryLimitAttributeValueAsBetween1And255OnTheDutAndVerifyThatTheDutSendsSuccessResponse_20()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id wrongCodeEntryLimitArgument;
        wrongCodeEntryLimitArgument = [NSNumber numberWithUnsignedChar:3U];
        [cluster writeAttributeWrongCodeEntryLimitWithValue:wrongCodeEntryLimitArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"TH writes WrongCodeEntryLimit attribute value as between 1 and 255 on "
                                                           @"the DUT and Verify that the DUT sends Success response Error: %@",
                                                         err);

                                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesWrongCodeEntryLimitAttributeValueAsBetween1And255OnTheDutAndVerifyDutRespondsWithUnsupportedWrite_21()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id wrongCodeEntryLimitArgument;
        wrongCodeEntryLimitArgument = [NSNumber numberWithUnsignedChar:3U];
        [cluster writeAttributeWrongCodeEntryLimitWithValue:wrongCodeEntryLimitArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"TH writes WrongCodeEntryLimit attribute value as between 1 and 255 on "
                                                           @"the DUT and verify DUT responds with UNSUPPORTED_WRITE Error: %@",
                                                         err);

                                                     VerifyOrReturn(CheckValue("status",
                                                         err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                 ? err.code
                                                                 : EMBER_ZCL_STATUS_FAILURE)
                                                             : 0,
                                                         EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheUserCodeTemporaryDisableTimeAttributeFromTheDut_22()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeUserCodeTemporaryDisableTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the UserCodeTemporaryDisableTime attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("userCodeTemporaryDisableTime", [value unsignedCharValue], 1U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("userCodeTemporaryDisableTime", [value unsignedCharValue], 255U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestThWritesUserCodeTemporaryDisableTimeAttributeValueAsBetween1And255OnTheDutAndVerifyThatTheDutSendsSuccessResponse_23()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id userCodeTemporaryDisableTimeArgument;
        userCodeTemporaryDisableTimeArgument = [NSNumber numberWithUnsignedChar:15U];
        [cluster writeAttributeUserCodeTemporaryDisableTimeWithValue:userCodeTemporaryDisableTimeArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"TH writes UserCodeTemporaryDisableTime attribute value as "
                                                                    @"between 1 and 255 on the DUT and Verify that the DUT sends "
                                                                    @"Success response Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestThWritesUserCodeTemporaryDisableTimeAttributeValueAsBetween1And255OnTheDutAndVerifyDutRespondsWithUnsupportedWrite_24()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id userCodeTemporaryDisableTimeArgument;
        userCodeTemporaryDisableTimeArgument = [NSNumber numberWithUnsignedChar:15U];
        [cluster writeAttributeUserCodeTemporaryDisableTimeWithValue:userCodeTemporaryDisableTimeArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"TH writes UserCodeTemporaryDisableTime attribute value as "
                                                                    @"between 1 and 255 on the DUT and verify DUT responds with "
                                                                    @"UNSUPPORTED_WRITE Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status",
                                                                  err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                          ? err.code
                                                                          : EMBER_ZCL_STATUS_FAILURE)
                                                                      : 0,
                                                                  EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCleanTheCreatedUser_25()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster clearUserWithParams:params
                          completion:^(NSError * _Nullable err) {
                              NSLog(@"Clean the created user Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCleanupTheCreatedCredential_26()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        [cluster clearCredentialWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Cleanup the created credential Error: %@", err);

                                    VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_DRLK_2_3 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_DRLK_2_3()
        : TestCommandBridge("Test_TC_DRLK_2_3")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_DRLK_2_3() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_DRLK_2_3\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_DRLK_2_3\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Create new user\n");
            err = TestCreateNewUser_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the user back and verify its fields\n");
            err = TestReadTheUserBackAndVerifyItsFields_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Create new PIN credential and lock/unlock user\n");
            err = TestCreateNewPinCredentialAndLockUnlockUser_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Verify created PIN credential\n");
            err = TestVerifyCreatedPinCredential_4();
            break;
        case 5:
            ChipLogProgress(
                chipTool, " ***** Test Step 5 : TH writes the RequirePINforRemoteOperation attribute value as False on the DUT\n");
            if (ShouldSkip("DRLK.S.F07 && DRLK.S.F00 && DRLK.S.A0033")) {
                NextTest();
                return;
            }
            err = TestThWritesTheRequirePINforRemoteOperationAttributeValueAsFalseOnTheDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool,
                " ***** Test Step 6 : TH writes the RequirePINforRemoteOperation attribute value as False on the DUT and Verify "
                "DUT responds with UNSUPPORTED_WRITE\n");
            if (ShouldSkip("DRLK.S.F07 && DRLK.S.F00 && ! DRLK.S.A0033")) {
                NextTest();
                return;
            }
            err = TestThWritesTheRequirePINforRemoteOperationAttributeValueAsFalseOnTheDutAndVerifyDutRespondsWithUnsupportedWrite_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH reads the RequirePINforRemoteOperation attribute from the DUT\n");
            if (ShouldSkip("DRLK.S.F07 && DRLK.S.F00 && DRLK.S.A0033")) {
                NextTest();
                return;
            }
            err = TestThReadsTheRequirePINforRemoteOperationAttributeFromTheDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : TH sends the unlock Door command to the DUT without PINCode\n");
            if (ShouldSkip("DRLK.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsTheUnlockDoorCommandToTheDutWithoutPINCode_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH sends the unlock Door command to the DUT with valid PINCode\n");
            if (ShouldSkip("DRLK.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsTheUnlockDoorCommandToTheDutWithValidPINCode_9();
            break;
        case 10:
            ChipLogProgress(
                chipTool, " ***** Test Step 10 : TH writes the RequirePINforRemoteOperation attribute value as False on the DUT\n");
            if (ShouldSkip("DRLK.S.F07 && DRLK.S.F00 && DRLK.S.A0033")) {
                NextTest();
                return;
            }
            err = TestThWritesTheRequirePINforRemoteOperationAttributeValueAsFalseOnTheDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool,
                " ***** Test Step 11 : TH writes the RequirePINforRemoteOperation attribute value as False on the DUT and Verify "
                "DUT responds with UNSUPPORTED_WRITE\n");
            if (ShouldSkip("DRLK.S.F07 && DRLK.S.F00 && ! DRLK.S.A0033")) {
                NextTest();
                return;
            }
            err = TestThWritesTheRequirePINforRemoteOperationAttributeValueAsFalseOnTheDutAndVerifyDutRespondsWithUnsupportedWrite_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : TH reads the RequirePINforRemoteOperation attribute from the DUT\n");
            if (ShouldSkip("DRLK.S.F07 && DRLK.S.F00 && DRLK.S.A0033")) {
                NextTest();
                return;
            }
            err = TestThReadsTheRequirePINforRemoteOperationAttributeFromTheDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : TH sends the unlock Door command to the DUT with valid PINCode\n");
            if (ShouldSkip("DRLK.S.C01.Rsp && DRLK.S.A0033")) {
                NextTest();
                return;
            }
            err = TestThSendsTheUnlockDoorCommandToTheDutWithValidPINCode_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : TH sends the unlock Door command to the DUT with invalid PINCode\n");
            if (ShouldSkip("DRLK.S.C01.Rsp && DRLK.S.A0033")) {
                NextTest();
                return;
            }
            err = TestThSendsTheUnlockDoorCommandToTheDutWithInvalidPINCode_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : TH sends the unlock Door command to the DUT without PINCode\n");
            if (ShouldSkip("DRLK.S.C01.Rsp && DRLK.S.A0033")) {
                NextTest();
                return;
            }
            err = TestThSendsTheUnlockDoorCommandToTheDutWithoutPINCode_15();
            break;
        case 16:
            ChipLogProgress(chipTool,
                " ***** Test Step 16 : TH writes WrongCodeEntryLimit attribute value as 3 on the DUT and Verify that the DUT sends "
                "Success response\n");
            if (ShouldSkip("DRLK.S.F00 && DRLK.S.F01 && DRLK.S.A0030")) {
                NextTest();
                return;
            }
            err = TestThWritesWrongCodeEntryLimitAttributeValueAs3OnTheDutAndVerifyThatTheDutSendsSuccessResponse_16();
            break;
        case 17:
            ChipLogProgress(chipTool,
                " ***** Test Step 17 : TH writes WrongCodeEntryLimit attribute value as 3 on the DUT and verify DUT responds with "
                "UNSUPPORTED_WRITE\n");
            if (ShouldSkip("DRLK.S.F00 && DRLK.S.F01 && ! DRLK.S.A0030")) {
                NextTest();
                return;
            }
            err = TestThWritesWrongCodeEntryLimitAttributeValueAs3OnTheDutAndVerifyDutRespondsWithUnsupportedWrite_17();
            break;
        case 18:
            ChipLogProgress(chipTool,
                " ***** Test Step 18 : TH writes UserCodeTemporaryDisableTime attribute value as 15 Seconds on the DUT and Verify "
                "that the DUT sends Success response\n");
            if (ShouldSkip("DRLK.S.F00 && DRLK.S.F01 && DRLK.S.A0031")) {
                NextTest();
                return;
            }
            err = TestThWritesUserCodeTemporaryDisableTimeAttributeValueAs15SecondsOnTheDutAndVerifyThatTheDutSendsSuccessResponse_18();
            break;
        case 19:
            ChipLogProgress(chipTool,
                " ***** Test Step 19 : TH writes UserCodeTemporaryDisableTime attribute value as 15 Seconds on the DUT and Verify "
                "that the DUT sends Success response\n");
            if (ShouldSkip("DRLK.S.F00 && DRLK.S.F01 && ! DRLK.S.A0031")) {
                NextTest();
                return;
            }
            err = TestThWritesUserCodeTemporaryDisableTimeAttributeValueAs15SecondsOnTheDutAndVerifyThatTheDutSendsSuccessResponse_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : TH sends the unlock Door command to the DUT with invalid PINCode\n");
            if (ShouldSkip("DRLK.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsTheUnlockDoorCommandToTheDutWithInvalidPINCode_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : TH sends the unlock Door command to the DUT with invalid PINCode\n");
            if (ShouldSkip("DRLK.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsTheUnlockDoorCommandToTheDutWithInvalidPINCode_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : TH sends the unlock Door command to the DUT with invalid PINCode\n");
            if (ShouldSkip("DRLK.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsTheUnlockDoorCommandToTheDutWithInvalidPINCode_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : TH sends the unlock Door command to the DUT with invalid PINCode\n");
            if (ShouldSkip("DRLK.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsTheUnlockDoorCommandToTheDutWithInvalidPINCode_23();
            break;
        case 24:
            ChipLogProgress(chipTool,
                " ***** Test Step 24 : TH reads the UserCodeTemporaryDisableTime attribute from the DUT and check attribute is "
                "triggered\n");
            if (ShouldSkip("DRLK.S.F07 && DRLK.S.F00 && DRLK.S.A0031")) {
                NextTest();
                return;
            }
            err = TestThReadsTheUserCodeTemporaryDisableTimeAttributeFromTheDutAndCheckAttributeIsTriggered_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : TH sends the unlock Door command to the DUT with valid PINCode\n");
            if (ShouldSkip("DRLK.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsTheUnlockDoorCommandToTheDutWithValidPINCode_25();
            break;
        case 26:
            ChipLogProgress(chipTool, " ***** Test Step 26 : TH writes AutoRelockTime attribute value as 10 seconds on the DUT\n");
            if (ShouldSkip("DRLK.S.A0023 && PICS_SDK_CI_ONLY")) {
                NextTest();
                return;
            }
            err = TestThWritesAutoRelockTimeAttributeValueAs10SecondsOnTheDut_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : TH writes AutoRelockTime attribute value as 60 seconds on the DUT\n");
            if (ShouldSkip("DRLK.S.A0023 && PICS_SKIP_SAMPLE_APP")) {
                NextTest();
                return;
            }
            err = TestThWritesAutoRelockTimeAttributeValueAs60SecondsOnTheDut_27();
            break;
        case 28:
            ChipLogProgress(chipTool, " ***** Test Step 28 : TH writes AutoRelockTime attribute value as 10 seconds on the DUT\n");
            if (ShouldSkip("!DRLK.S.A0023 && PICS_SDK_CI_ONLY")) {
                NextTest();
                return;
            }
            err = TestThWritesAutoRelockTimeAttributeValueAs10SecondsOnTheDut_28();
            break;
        case 29:
            ChipLogProgress(chipTool, " ***** Test Step 29 : TH writes AutoRelockTime attribute value as 60 seconds on the DUT\n");
            if (ShouldSkip("!DRLK.S.A0023 && PICS_SKIP_SAMPLE_APP")) {
                NextTest();
                return;
            }
            err = TestThWritesAutoRelockTimeAttributeValueAs60SecondsOnTheDut_29();
            break;
        case 30:
            ChipLogProgress(chipTool, " ***** Test Step 30 : TH reads the AutoRelockTime attribute from the DUT\n");
            if (ShouldSkip("DRLK.S.A0023 && PICS_SDK_CI_ONLY")) {
                NextTest();
                return;
            }
            err = TestThReadsTheAutoRelockTimeAttributeFromTheDut_30();
            break;
        case 31:
            ChipLogProgress(chipTool, " ***** Test Step 31 : TH reads the AutoRelockTime attribute from the DUT\n");
            if (ShouldSkip("DRLK.S.A0023 && PICS_SKIP_SAMPLE_APP")) {
                NextTest();
                return;
            }
            err = TestThReadsTheAutoRelockTimeAttributeFromTheDut_31();
            break;
        case 32:
            ChipLogProgress(chipTool,
                " ***** Test Step 32 : TH sends the unlock Door command to the DUT with valid PINCode and Verify that DUT sends "
                "SUCCESS response to the TH\n");
            if (ShouldSkip("PICS_USER_PROMPT && DRLK.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsTheUnlockDoorCommandToTheDutWithValidPINCodeAndVerifyThatDutSendsSuccessResponseToTheTh_32();
            break;
        case 33:
            ChipLogProgress(chipTool,
                " ***** Test Step 33 : TH reads LockState attribute after AutoRelockTime Expires and Verify that the DUT is "
                "locked.\n");
            if (ShouldSkip("PICS_USER_PROMPT && DRLK.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsLockStateAttributeAfterAutoRelockTimeExpiresAndVerifyThatTheDutIsLocked_33();
            break;
        case 34:
            ChipLogProgress(chipTool, " ***** Test Step 34 : Cleanup the created user\n");
            err = TestCleanupTheCreatedUser_34();
            break;
        case 35:
            ChipLogProgress(chipTool, " ***** Test Step 35 : Clean the created credential\n");
            if (ShouldSkip("DRLK.S.C26.Rsp")) {
                NextTest();
                return;
            }
            err = TestCleanTheCreatedCredential_35();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 36;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestCreateNewUser_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userName = @"xxx";
        params.userUniqueID = [NSNumber numberWithUnsignedInt:6452UL];
        params.userStatus = [NSNumber numberWithUnsignedChar:1U];
        params.userType = [NSNumber numberWithUnsignedChar:0U];
        params.credentialRule = [NSNumber numberWithUnsignedChar:0U];
        [cluster setUserWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"Create new user Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheUserBackAndVerifyItsFields_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the user back and verify its fields Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNonNull("UserName", actualValue));
                                VerifyOrReturn(CheckValueAsString("UserName", actualValue, @"xxx"));
                            }

                            {
                                id actualValue = values.userUniqueID;
                                VerifyOrReturn(CheckValueNonNull("UserUniqueID", actualValue));
                                VerifyOrReturn(CheckValue("UserUniqueID", actualValue, 6452UL));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNonNull("UserStatus", actualValue));
                                VerifyOrReturn(CheckValue("UserStatus", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNonNull("UserType", actualValue));
                                VerifyOrReturn(CheckValue("UserType", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNonNull("CredentialRule", actualValue));
                                VerifyOrReturn(CheckValue("CredentialRule", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("Credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("CreatorFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("CreatorFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("LastModifiedFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("LastModifiedFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("NextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewPinCredentialAndLockUnlockUser_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        params.credentialData = [[NSData alloc] initWithBytes:"123456" length:6];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new PIN credential and lock/unlock user Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("NextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("NextCredentialIndex", actualValue, 2U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyCreatedPinCredential_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        [cluster getCredentialStatusWithParams:params
                                    completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                        NSError * _Nullable err) {
                                        NSLog(@"Verify created PIN credential Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = values.credentialExists;
                                            VerifyOrReturn(CheckValue("CredentialExists", actualValue, true));
                                        }

                                        {
                                            id actualValue = values.userIndex;
                                            VerifyOrReturn(CheckValueNonNull("UserIndex", actualValue));
                                            VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                                        }

                                        {
                                            id actualValue = values.creatorFabricIndex;
                                            VerifyOrReturn(CheckValueNonNull("CreatorFabricIndex", actualValue));
                                            VerifyOrReturn(CheckValue("CreatorFabricIndex", actualValue, 1U));
                                        }

                                        {
                                            id actualValue = values.lastModifiedFabricIndex;
                                            VerifyOrReturn(CheckValueNonNull("LastModifiedFabricIndex", actualValue));
                                            VerifyOrReturn(CheckValue("LastModifiedFabricIndex", actualValue, 1U));
                                        }

                                        {
                                            id actualValue = values.nextCredentialIndex;
                                            VerifyOrReturn(CheckValueNull("NextCredentialIndex", actualValue));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesTheRequirePINforRemoteOperationAttributeValueAsFalseOnTheDut_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id requirePINforRemoteOperationArgument;
        requirePINforRemoteOperationArgument = [NSNumber numberWithBool:false];
        [cluster writeAttributeRequirePINforRemoteOperationWithValue:requirePINforRemoteOperationArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"TH writes the RequirePINforRemoteOperation attribute value "
                                                                    @"as False on the DUT Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesTheRequirePINforRemoteOperationAttributeValueAsFalseOnTheDutAndVerifyDutRespondsWithUnsupportedWrite_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id requirePINforRemoteOperationArgument;
        requirePINforRemoteOperationArgument = [NSNumber numberWithBool:false];
        [cluster
            writeAttributeRequirePINforRemoteOperationWithValue:requirePINforRemoteOperationArgument
                                                     completion:^(NSError * _Nullable err) {
                                                         NSLog(
                                                             @"TH writes the RequirePINforRemoteOperation attribute value as False "
                                                             @"on the DUT and Verify DUT responds with UNSUPPORTED_WRITE Error: %@",
                                                             err);

                                                         VerifyOrReturn(CheckValue("status",
                                                             err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                     ? err.code
                                                                     : EMBER_ZCL_STATUS_FAILURE)
                                                                 : 0,
                                                             EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
                                                         NextTest();
                                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheRequirePINforRemoteOperationAttributeFromTheDut_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRequirePINforRemoteOperationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the RequirePINforRemoteOperation attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("RequirePINforRemoteOperation", actualValue, false));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsTheUnlockDoorCommandToTheDutWithoutPINCode_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
        [cluster unlockDoorWithParams:params
                           completion:^(NSError * _Nullable err) {
                               NSLog(@"TH sends the unlock Door command to the DUT without PINCode Error: %@", err);

                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                               NextTest();
                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsTheUnlockDoorCommandToTheDutWithValidPINCode_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"123456" length:6];
        [cluster unlockDoorWithParams:params
                           completion:^(NSError * _Nullable err) {
                               NSLog(@"TH sends the unlock Door command to the DUT with valid PINCode Error: %@", err);

                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                               NextTest();
                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesTheRequirePINforRemoteOperationAttributeValueAsFalseOnTheDut_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id requirePINforRemoteOperationArgument;
        requirePINforRemoteOperationArgument = [NSNumber numberWithBool:true];
        [cluster writeAttributeRequirePINforRemoteOperationWithValue:requirePINforRemoteOperationArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"TH writes the RequirePINforRemoteOperation attribute value "
                                                                    @"as False on the DUT Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesTheRequirePINforRemoteOperationAttributeValueAsFalseOnTheDutAndVerifyDutRespondsWithUnsupportedWrite_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id requirePINforRemoteOperationArgument;
        requirePINforRemoteOperationArgument = [NSNumber numberWithBool:true];
        [cluster
            writeAttributeRequirePINforRemoteOperationWithValue:requirePINforRemoteOperationArgument
                                                     completion:^(NSError * _Nullable err) {
                                                         NSLog(
                                                             @"TH writes the RequirePINforRemoteOperation attribute value as False "
                                                             @"on the DUT and Verify DUT responds with UNSUPPORTED_WRITE Error: %@",
                                                             err);

                                                         VerifyOrReturn(CheckValue("status",
                                                             err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                     ? err.code
                                                                     : EMBER_ZCL_STATUS_FAILURE)
                                                                 : 0,
                                                             EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
                                                         NextTest();
                                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheRequirePINforRemoteOperationAttributeFromTheDut_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRequirePINforRemoteOperationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the RequirePINforRemoteOperation attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("RequirePINforRemoteOperation", actualValue, true));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsTheUnlockDoorCommandToTheDutWithValidPINCode_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"123456" length:6];
        [cluster unlockDoorWithParams:params
                           completion:^(NSError * _Nullable err) {
                               NSLog(@"TH sends the unlock Door command to the DUT with valid PINCode Error: %@", err);

                               VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                               NextTest();
                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsTheUnlockDoorCommandToTheDutWithInvalidPINCode_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"1234568" length:7];
        [cluster
            unlockDoorWithParams:params
                      completion:^(NSError * _Nullable err) {
                          NSLog(@"TH sends the unlock Door command to the DUT with invalid PINCode Error: %@", err);

                          VerifyOrReturn(CheckValue("status",
                              err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                  : 0,
                              EMBER_ZCL_STATUS_FAILURE));
                          NextTest();
                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsTheUnlockDoorCommandToTheDutWithoutPINCode_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
        [cluster
            unlockDoorWithParams:params
                      completion:^(NSError * _Nullable err) {
                          NSLog(@"TH sends the unlock Door command to the DUT without PINCode Error: %@", err);

                          VerifyOrReturn(CheckValue("status",
                              err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                  : 0,
                              EMBER_ZCL_STATUS_FAILURE));
                          NextTest();
                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesWrongCodeEntryLimitAttributeValueAs3OnTheDutAndVerifyThatTheDutSendsSuccessResponse_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id wrongCodeEntryLimitArgument;
        wrongCodeEntryLimitArgument = [NSNumber numberWithUnsignedChar:3U];
        [cluster writeAttributeWrongCodeEntryLimitWithValue:wrongCodeEntryLimitArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"TH writes WrongCodeEntryLimit attribute value as 3 on the DUT and "
                                                           @"Verify that the DUT sends Success response Error: %@",
                                                         err);

                                                     VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesWrongCodeEntryLimitAttributeValueAs3OnTheDutAndVerifyDutRespondsWithUnsupportedWrite_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id wrongCodeEntryLimitArgument;
        wrongCodeEntryLimitArgument = [NSNumber numberWithUnsignedChar:3U];
        [cluster writeAttributeWrongCodeEntryLimitWithValue:wrongCodeEntryLimitArgument
                                                 completion:^(NSError * _Nullable err) {
                                                     NSLog(@"TH writes WrongCodeEntryLimit attribute value as 3 on the DUT and "
                                                           @"verify DUT responds with UNSUPPORTED_WRITE Error: %@",
                                                         err);

                                                     VerifyOrReturn(CheckValue("status",
                                                         err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                 ? err.code
                                                                 : EMBER_ZCL_STATUS_FAILURE)
                                                             : 0,
                                                         EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesUserCodeTemporaryDisableTimeAttributeValueAs15SecondsOnTheDutAndVerifyThatTheDutSendsSuccessResponse_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id userCodeTemporaryDisableTimeArgument;
        userCodeTemporaryDisableTimeArgument = [NSNumber numberWithUnsignedChar:15U];
        [cluster writeAttributeUserCodeTemporaryDisableTimeWithValue:userCodeTemporaryDisableTimeArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"TH writes UserCodeTemporaryDisableTime attribute value as 15 "
                                                                    @"Seconds on the DUT and Verify that the DUT sends Success "
                                                                    @"response Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesUserCodeTemporaryDisableTimeAttributeValueAs15SecondsOnTheDutAndVerifyThatTheDutSendsSuccessResponse_19()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id userCodeTemporaryDisableTimeArgument;
        userCodeTemporaryDisableTimeArgument = [NSNumber numberWithUnsignedChar:15U];
        [cluster writeAttributeUserCodeTemporaryDisableTimeWithValue:userCodeTemporaryDisableTimeArgument
                                                          completion:^(NSError * _Nullable err) {
                                                              NSLog(@"TH writes UserCodeTemporaryDisableTime attribute value as 15 "
                                                                    @"Seconds on the DUT and Verify that the DUT sends Success "
                                                                    @"response Error: %@",
                                                                  err);

                                                              VerifyOrReturn(CheckValue("status",
                                                                  err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                                          ? err.code
                                                                          : EMBER_ZCL_STATUS_FAILURE)
                                                                      : 0,
                                                                  EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
                                                              NextTest();
                                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsTheUnlockDoorCommandToTheDutWithInvalidPINCode_20()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"1234568" length:7];
        [cluster
            unlockDoorWithParams:params
                      completion:^(NSError * _Nullable err) {
                          NSLog(@"TH sends the unlock Door command to the DUT with invalid PINCode Error: %@", err);

                          VerifyOrReturn(CheckValue("status",
                              err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                  : 0,
                              EMBER_ZCL_STATUS_FAILURE));
                          NextTest();
                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsTheUnlockDoorCommandToTheDutWithInvalidPINCode_21()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"1234568" length:7];
        [cluster
            unlockDoorWithParams:params
                      completion:^(NSError * _Nullable err) {
                          NSLog(@"TH sends the unlock Door command to the DUT with invalid PINCode Error: %@", err);

                          VerifyOrReturn(CheckValue("status",
                              err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                  : 0,
                              EMBER_ZCL_STATUS_FAILURE));
                          NextTest();
                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsTheUnlockDoorCommandToTheDutWithInvalidPINCode_22()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"1234568" length:7];
        [cluster
            unlockDoorWithParams:params
                      completion:^(NSError * _Nullable err) {
                          NSLog(@"TH sends the unlock Door command to the DUT with invalid PINCode Error: %@", err);

                          VerifyOrReturn(CheckValue("status",
                              err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                  : 0,
                              EMBER_ZCL_STATUS_FAILURE));
                          NextTest();
                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsTheUnlockDoorCommandToTheDutWithInvalidPINCode_23()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"1234568" length:7];
        [cluster
            unlockDoorWithParams:params
                      completion:^(NSError * _Nullable err) {
                          NSLog(@"TH sends the unlock Door command to the DUT with invalid PINCode Error: %@", err);

                          VerifyOrReturn(CheckValue("status",
                              err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                  : 0,
                              EMBER_ZCL_STATUS_FAILURE));
                          NextTest();
                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheUserCodeTemporaryDisableTimeAttributeFromTheDutAndCheckAttributeIsTriggered_24()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeUserCodeTemporaryDisableTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the UserCodeTemporaryDisableTime attribute from the DUT and check attribute is triggered Error: %@",
                err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("UserCodeTemporaryDisableTime", actualValue, 15U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsTheUnlockDoorCommandToTheDutWithValidPINCode_25()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"123456" length:6];
        [cluster
            unlockDoorWithParams:params
                      completion:^(NSError * _Nullable err) {
                          NSLog(@"TH sends the unlock Door command to the DUT with valid PINCode Error: %@", err);

                          VerifyOrReturn(CheckValue("status",
                              err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                  : 0,
                              EMBER_ZCL_STATUS_FAILURE));
                          NextTest();
                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesAutoRelockTimeAttributeValueAs10SecondsOnTheDut_26()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id autoRelockTimeArgument;
        autoRelockTimeArgument = [NSNumber numberWithUnsignedInt:10UL];
        [cluster
            writeAttributeAutoRelockTimeWithValue:autoRelockTimeArgument
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(
                                               @"TH writes AutoRelockTime attribute value as 10 seconds on the DUT Error: %@", err);

                                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesAutoRelockTimeAttributeValueAs60SecondsOnTheDut_27()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id autoRelockTimeArgument;
        autoRelockTimeArgument = [NSNumber numberWithUnsignedInt:60UL];
        [cluster
            writeAttributeAutoRelockTimeWithValue:autoRelockTimeArgument
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(
                                               @"TH writes AutoRelockTime attribute value as 60 seconds on the DUT Error: %@", err);

                                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesAutoRelockTimeAttributeValueAs10SecondsOnTheDut_28()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id autoRelockTimeArgument;
        autoRelockTimeArgument = [NSNumber numberWithUnsignedInt:10UL];
        [cluster
            writeAttributeAutoRelockTimeWithValue:autoRelockTimeArgument
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(
                                               @"TH writes AutoRelockTime attribute value as 10 seconds on the DUT Error: %@", err);

                                           VerifyOrReturn(CheckValue("status",
                                               err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                       ? err.code
                                                       : EMBER_ZCL_STATUS_FAILURE)
                                                   : 0,
                                               EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesAutoRelockTimeAttributeValueAs60SecondsOnTheDut_29()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id autoRelockTimeArgument;
        autoRelockTimeArgument = [NSNumber numberWithUnsignedInt:60UL];
        [cluster
            writeAttributeAutoRelockTimeWithValue:autoRelockTimeArgument
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(
                                               @"TH writes AutoRelockTime attribute value as 60 seconds on the DUT Error: %@", err);

                                           VerifyOrReturn(CheckValue("status",
                                               err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                       ? err.code
                                                       : EMBER_ZCL_STATUS_FAILURE)
                                                   : 0,
                                               EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheAutoRelockTimeAttributeFromTheDut_30()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAutoRelockTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the AutoRelockTime attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AutoRelockTime", actualValue, 10UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheAutoRelockTimeAttributeFromTheDut_31()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAutoRelockTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the AutoRelockTime attribute from the DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("AutoRelockTime", actualValue, 60UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsTheUnlockDoorCommandToTheDutWithValidPINCodeAndVerifyThatDutSendsSuccessResponseToTheTh_32()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestThReadsLockStateAttributeAfterAutoRelockTimeExpiresAndVerifyThatTheDutIsLocked_33()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestCleanupTheCreatedUser_34()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster clearUserWithParams:params
                          completion:^(NSError * _Nullable err) {
                              NSLog(@"Cleanup the created user Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCleanTheCreatedCredential_35()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        [cluster clearCredentialWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clean the created credential Error: %@", err);

                                    VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_DRLK_2_4 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_DRLK_2_4()
        : TestCommandBridge("Test_TC_DRLK_2_4")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_DRLK_2_4() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_DRLK_2_4\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_DRLK_2_4\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Create new user\n");
            err = TestCreateNewUser_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the user back and verify its fields\n");
            err = TestReadTheUserBackAndVerifyItsFields_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Create new PIN credential and lock/unlock user\n");
            err = TestCreateNewPinCredentialAndLockUnlockUser_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Verify created PIN credential\n");
            err = TestVerifyCreatedPinCredential_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH writes AutoRelockTime attribute value as 60 seconds on the DUT\n");
            if (ShouldSkip("DRLK.S.A0023")) {
                NextTest();
                return;
            }
            err = TestThWritesAutoRelockTimeAttributeValueAs60SecondsOnTheDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : TH writes AutoRelockTime attribute value as 60 seconds on the DUT\n");
            if (ShouldSkip(" !DRLK.S.A0023 ")) {
                NextTest();
                return;
            }
            err = TestThWritesAutoRelockTimeAttributeValueAs60SecondsOnTheDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH sends the Unlock with Timeout argument value as 60 seconds\n");
            if (ShouldSkip("DRLK.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsTheUnlockWithTimeoutArgumentValueAs60Seconds_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Wait 60s\n");
            if (ShouldSkip("DRLK.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestWait60s_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH reads LockState attribute\n");
            if (ShouldSkip("DRLK.S.A0000 && DRLK.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsLockStateAttribute_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Cleanup the created user\n");
            err = TestCleanupTheCreatedUser_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Clean the created credential\n");
            if (ShouldSkip("DRLK.S.C26.Rsp")) {
                NextTest();
                return;
            }
            err = TestCleanTheCreatedCredential_11();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 12;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestCreateNewUser_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userName = @"xxx";
        params.userUniqueID = [NSNumber numberWithUnsignedInt:6452UL];
        params.userStatus = [NSNumber numberWithUnsignedChar:1U];
        params.userType = [NSNumber numberWithUnsignedChar:0U];
        params.credentialRule = [NSNumber numberWithUnsignedChar:0U];
        [cluster setUserWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"Create new user Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheUserBackAndVerifyItsFields_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the user back and verify its fields Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNonNull("UserName", actualValue));
                                VerifyOrReturn(CheckValueAsString("UserName", actualValue, @"xxx"));
                            }

                            {
                                id actualValue = values.userUniqueID;
                                VerifyOrReturn(CheckValueNonNull("UserUniqueID", actualValue));
                                VerifyOrReturn(CheckValue("UserUniqueID", actualValue, 6452UL));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNonNull("UserStatus", actualValue));
                                VerifyOrReturn(CheckValue("UserStatus", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNonNull("UserType", actualValue));
                                VerifyOrReturn(CheckValue("UserType", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNonNull("CredentialRule", actualValue));
                                VerifyOrReturn(CheckValue("CredentialRule", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("Credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("CreatorFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("CreatorFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("LastModifiedFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("LastModifiedFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("NextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewPinCredentialAndLockUnlockUser_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        params.credentialData = [[NSData alloc] initWithBytes:"123456" length:6];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Create new PIN credential and lock/unlock user Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("NextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("NextCredentialIndex", actualValue, 2U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyCreatedPinCredential_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        [cluster getCredentialStatusWithParams:params
                                    completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                        NSError * _Nullable err) {
                                        NSLog(@"Verify created PIN credential Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = values.credentialExists;
                                            VerifyOrReturn(CheckValue("CredentialExists", actualValue, true));
                                        }

                                        {
                                            id actualValue = values.userIndex;
                                            VerifyOrReturn(CheckValueNonNull("UserIndex", actualValue));
                                            VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                                        }

                                        {
                                            id actualValue = values.creatorFabricIndex;
                                            VerifyOrReturn(CheckValueNonNull("CreatorFabricIndex", actualValue));
                                            VerifyOrReturn(CheckValue("CreatorFabricIndex", actualValue, 1U));
                                        }

                                        {
                                            id actualValue = values.lastModifiedFabricIndex;
                                            VerifyOrReturn(CheckValueNonNull("LastModifiedFabricIndex", actualValue));
                                            VerifyOrReturn(CheckValue("LastModifiedFabricIndex", actualValue, 1U));
                                        }

                                        {
                                            id actualValue = values.nextCredentialIndex;
                                            VerifyOrReturn(CheckValueNull("NextCredentialIndex", actualValue));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesAutoRelockTimeAttributeValueAs60SecondsOnTheDut_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id autoRelockTimeArgument;
        autoRelockTimeArgument = [NSNumber numberWithUnsignedInt:60UL];
        [cluster
            writeAttributeAutoRelockTimeWithValue:autoRelockTimeArgument
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(
                                               @"TH writes AutoRelockTime attribute value as 60 seconds on the DUT Error: %@", err);

                                           VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesAutoRelockTimeAttributeValueAs60SecondsOnTheDut_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id autoRelockTimeArgument;
        autoRelockTimeArgument = [NSNumber numberWithUnsignedInt:60UL];
        [cluster
            writeAttributeAutoRelockTimeWithValue:autoRelockTimeArgument
                                       completion:^(NSError * _Nullable err) {
                                           NSLog(
                                               @"TH writes AutoRelockTime attribute value as 60 seconds on the DUT Error: %@", err);

                                           VerifyOrReturn(CheckValue("status",
                                               err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                       ? err.code
                                                       : EMBER_ZCL_STATUS_FAILURE)
                                                   : 0,
                                               EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
                                           NextTest();
                                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsTheUnlockWithTimeoutArgumentValueAs60Seconds_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterUnlockWithTimeoutParams alloc] init];
        params.timeout = [NSNumber numberWithUnsignedShort:60U];
        params.pinCode = [[NSData alloc] initWithBytes:"123456" length:6];
        [cluster unlockWithTimeoutWithParams:params
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"TH sends the Unlock with Timeout argument value as 60 seconds Error: %@", err);

                                      VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait60s_8()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 60000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsLockStateAttribute_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLockStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads LockState attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("LockState", actualValue));
                VerifyOrReturn(CheckValue("LockState", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCleanupTheCreatedUser_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster clearUserWithParams:params
                          completion:^(NSError * _Nullable err) {
                              NSLog(@"Cleanup the created user Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCleanTheCreatedCredential_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        [cluster clearCredentialWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"Clean the created credential Error: %@", err);

                                    VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_DRLK_2_5 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_DRLK_2_5()
        : TestCommandBridge("Test_TC_DRLK_2_5")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_DRLK_2_5() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_DRLK_2_5\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_DRLK_2_5\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Create new user\n");
            err = TestCreateNewUser_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the user back and verify its fields\n");
            err = TestReadTheUserBackAndVerifyItsFields_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : TH reads NumberOfWeekDay SchedulesSupportedPerUser attribute\n");
            if (ShouldSkip("DRLK.S.F04 && DRLK.S.A0014")) {
                NextTest();
                return;
            }
            err = TestThReadsNumberOfWeekDaySchedulesSupportedPerUserAttribute_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH reads NumberOfTotalUsers Supported attribute\n");
            if (ShouldSkip("DRLK.S.F08 && DRLK.S.A0011")) {
                NextTest();
                return;
            }
            err = TestThReadsNumberOfTotalUsersSupportedAttribute_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH send Set Week Day Schedule Command\n");
            if (ShouldSkip("DRLK.S.F04 && DRLK.S.C0b.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendSetWeekDayScheduleCommand_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : TH send Get Week Day Schedule Command to DUT\n");
            if (ShouldSkip("DRLK.S.F04 && DRLK.S.C0c.Rsp && DRLK.S.C0c.Tx")) {
                NextTest();
                return;
            }
            err = TestThSendGetWeekDayScheduleCommandToDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH send Set Week Day Schedule Command\n");
            if (ShouldSkip("DRLK.S.F04 && DRLK.S.C0b.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendSetWeekDayScheduleCommand_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : TH send Get Week Day Schedule Command to DUT\n");
            if (ShouldSkip("DRLK.S.F04 && DRLK.S.C0c.Rsp && DRLK.S.C0c.Tx")) {
                NextTest();
                return;
            }
            err = TestThSendGetWeekDayScheduleCommandToDut_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH sends Clear Week Day Schedule Command to DUT\n");
            if (ShouldSkip("DRLK.S.F04 && DRLK.S.C0d.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsClearWeekDayScheduleCommandToDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : TH sends Get Week Day Schedule Command to DUT\n");
            if (ShouldSkip("DRLK.S.F04 && DRLK.S.C0c.Rsp && DRLK.S.C0c.Tx")) {
                NextTest();
                return;
            }
            err = TestThSendsGetWeekDayScheduleCommandToDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Cleanup the created user\n");
            err = TestCleanupTheCreatedUser_11();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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_INVALID_COMMAND));
            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), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 12;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestCreateNewUser_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userName = @"xxx";
        params.userUniqueID = [NSNumber numberWithUnsignedInt:6452UL];
        params.userStatus = [NSNumber numberWithUnsignedChar:1U];
        params.userType = [NSNumber numberWithUnsignedChar:0U];
        params.credentialRule = [NSNumber numberWithUnsignedChar:0U];
        [cluster setUserWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"Create new user Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheUserBackAndVerifyItsFields_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the user back and verify its fields Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNonNull("UserName", actualValue));
                                VerifyOrReturn(CheckValueAsString("UserName", actualValue, @"xxx"));
                            }

                            {
                                id actualValue = values.userUniqueID;
                                VerifyOrReturn(CheckValueNonNull("UserUniqueID", actualValue));
                                VerifyOrReturn(CheckValue("UserUniqueID", actualValue, 6452UL));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNonNull("UserStatus", actualValue));
                                VerifyOrReturn(CheckValue("UserStatus", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNonNull("UserType", actualValue));
                                VerifyOrReturn(CheckValue("UserType", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNonNull("CredentialRule", actualValue));
                                VerifyOrReturn(CheckValue("CredentialRule", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("Credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("CreatorFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("CreatorFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("LastModifiedFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("LastModifiedFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("NextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull NumberOfWeekDaySchedulesSupportedPerUser;

    CHIP_ERROR TestThReadsNumberOfWeekDaySchedulesSupportedPerUserAttribute_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNumberOfWeekDaySchedulesSupportedPerUserWithCompletion:^(
            NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads NumberOfWeekDay SchedulesSupportedPerUser attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(
                CheckConstraintMinValue<uint8_t>("numberOfWeekDaySchedulesSupportedPerUser", [value unsignedCharValue], 0U));
            VerifyOrReturn(
                CheckConstraintMaxValue<uint8_t>("numberOfWeekDaySchedulesSupportedPerUser", [value unsignedCharValue], 255U));
            {
                NumberOfWeekDaySchedulesSupportedPerUser = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull NumberOfTotalUsersSupported;

    CHIP_ERROR TestThReadsNumberOfTotalUsersSupportedAttribute_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNumberOfTotalUsersSupportedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads NumberOfTotalUsers Supported attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("numberOfTotalUsersSupported", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("numberOfTotalUsersSupported", [value unsignedShortValue], 65534U));
            {
                NumberOfTotalUsersSupported = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendSetWeekDayScheduleCommand_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.daysMask = [NSNumber numberWithUnsignedChar:2U];
        params.startHour = [NSNumber numberWithUnsignedChar:15U];
        params.startMinute = [NSNumber numberWithUnsignedChar:45U];
        params.endHour = [NSNumber numberWithUnsignedChar:16U];
        params.endMinute = [NSNumber numberWithUnsignedChar:55U];
        [cluster setWeekDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"TH send Set Week Day Schedule Command Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendGetWeekDayScheduleCommandToDut_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster
            getWeekDayScheduleWithParams:params
                              completion:^(
                                  MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable values, NSError * _Nullable err) {
                                  NSLog(@"TH send Get Week Day Schedule Command to DUT Error: %@", err);

                                  VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                  {
                                      id actualValue = values.weekDayIndex;
                                      VerifyOrReturn(CheckValue("WeekDayIndex", actualValue, 1U));
                                  }

                                  {
                                      id actualValue = values.userIndex;
                                      VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                                  }

                                  {
                                      id actualValue = values.status;
                                      VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                                  }

                                  {
                                      id actualValue = values.daysMask;
                                      VerifyOrReturn(CheckValue("DaysMask", actualValue, 2U));
                                  }

                                  {
                                      id actualValue = values.startHour;
                                      VerifyOrReturn(CheckValue("StartHour", actualValue, 15U));
                                  }

                                  {
                                      id actualValue = values.startMinute;
                                      VerifyOrReturn(CheckValue("StartMinute", actualValue, 45U));
                                  }

                                  VerifyOrReturn(CheckConstraintHasValue("endHour", values.endHour, true));
                                  if (values.endHour != nil) {

                                      VerifyOrReturn(
                                          CheckConstraintMinValue<uint8_t>("endHour", [values.endHour unsignedCharValue], 16U));
                                  }

                                  VerifyOrReturn(CheckConstraintHasValue("endMinute", values.endMinute, true));
                                  if (values.endMinute != nil) {

                                      VerifyOrReturn(
                                          CheckConstraintMinValue<uint8_t>("endMinute", [values.endMinute unsignedCharValue], 55U));
                                  }

                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendSetWeekDayScheduleCommand_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.daysMask = [NSNumber numberWithUnsignedChar:7U];
        params.startHour = [NSNumber numberWithUnsignedChar:15U];
        params.startMinute = [NSNumber numberWithUnsignedChar:45U];
        params.endHour = [NSNumber numberWithUnsignedChar:16U];
        params.endMinute = [NSNumber numberWithUnsignedChar:55U];
        [cluster setWeekDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"TH send Set Week Day Schedule Command Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_COMMAND));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendGetWeekDayScheduleCommandToDut_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getWeekDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"TH send Get Week Day Schedule Command to DUT Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.weekDayIndex;
                                           VerifyOrReturn(CheckValue("WeekDayIndex", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 133U));
                                       }

                                       VerifyOrReturn(CheckConstraintHasValue("daysMask", values.daysMask, false));
                                       if (values.daysMask != nil) {
                                       }

                                       VerifyOrReturn(CheckConstraintHasValue("startHour", values.startHour, false));
                                       if (values.startHour != nil) {
                                       }

                                       VerifyOrReturn(CheckConstraintHasValue("startMinute", values.startMinute, false));
                                       if (values.startMinute != nil) {
                                       }

                                       VerifyOrReturn(CheckConstraintHasValue("endHour", values.endHour, false));
                                       if (values.endHour != nil) {
                                       }

                                       VerifyOrReturn(CheckConstraintHasValue("endMinute", values.endMinute, false));
                                       if (values.endMinute != nil) {
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsClearWeekDayScheduleCommandToDut_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster clearWeekDayScheduleWithParams:params
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"TH sends Clear Week Day Schedule Command to DUT Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsGetWeekDayScheduleCommandToDut_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
        params.weekDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getWeekDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetWeekDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"TH sends Get Week Day Schedule Command to DUT Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.weekDayIndex;
                                           VerifyOrReturn(CheckValue("WeekDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 139U));
                                       }

                                       VerifyOrReturn(CheckConstraintHasValue("daysMask", values.daysMask, false));
                                       if (values.daysMask != nil) {
                                       }

                                       VerifyOrReturn(CheckConstraintHasValue("startHour", values.startHour, false));
                                       if (values.startHour != nil) {
                                       }

                                       VerifyOrReturn(CheckConstraintHasValue("startMinute", values.startMinute, false));
                                       if (values.startMinute != nil) {
                                       }

                                       VerifyOrReturn(CheckConstraintHasValue("endHour", values.endHour, false));
                                       if (values.endHour != nil) {
                                       }

                                       VerifyOrReturn(CheckConstraintHasValue("endMinute", values.endMinute, false));
                                       if (values.endMinute != nil) {
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCleanupTheCreatedUser_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster clearUserWithParams:params
                          completion:^(NSError * _Nullable err) {
                              NSLog(@"Cleanup the created user Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_DRLK_2_6 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_DRLK_2_6()
        : TestCommandBridge("Test_TC_DRLK_2_6")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_DRLK_2_6() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_DRLK_2_6\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_DRLK_2_6\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for commissionee\n");
            err = TestWaitForCommissionee_0();
            break;
        case 1:
            ChipLogProgress(
                chipTool, " ***** Test Step 1 : TH reads NumberOfHoliday SchedulesSupported and saves for future use.\n");
            if (ShouldSkip("DRLK.S.F0b && DRLK.S.A0016")) {
                NextTest();
                return;
            }
            err = TestThReadsNumberOfHolidaySchedulesSupportedAndSavesForFutureUse_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Create Holiday schedule with 1 index\n");
            if (ShouldSkip("DRLK.S.F0b && DRLK.S.C11.Rsp")) {
                NextTest();
                return;
            }
            err = TestCreateHolidayScheduleWith1Index_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Get Holiday Schedule with HolidayIndex as 1\n");
            if (ShouldSkip("DRLK.S.F0b && DRLK.S.C12.Rsp && DRLK.S.C12.Tx")) {
                NextTest();
                return;
            }
            err = TestGetHolidayScheduleWithHolidayIndexAs1_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Create Holiday schedule with invalid operating mode\n");
            if (ShouldSkip("DRLK.S.C11.Rsp")) {
                NextTest();
                return;
            }
            err = TestCreateHolidayScheduleWithInvalidOperatingMode_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Get Holiday Schedule with Invalid HolidayIndex 15.\n");
            if (ShouldSkip("DRLK.S.F0b && DRLK.S.C12.Rsp && DRLK.S.C12.Tx")) {
                NextTest();
                return;
            }
            err = TestGetHolidayScheduleWithInvalidHolidayIndex15_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Get Holiday Schedule with the Non-scheduled HolidayIndex\n");
            if (ShouldSkip("DRLK.S.F0b && DRLK.S.C12.Rsp && DRLK.S.C12.Tx")) {
                NextTest();
                return;
            }
            err = TestGetHolidayScheduleWithTheNonScheduledHolidayIndex_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Clear Holiday schedule with 1 index\n");
            if (ShouldSkip("DRLK.S.F0b && DRLK.S.C13.Rsp")) {
                NextTest();
                return;
            }
            err = TestClearHolidayScheduleWith1Index_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Make sure that holiday schedule was deleted\n");
            if (ShouldSkip("DRLK.S.F0b && DRLK.S.C12.Rsp && DRLK.S.C12.Tx")) {
                NextTest();
                return;
            }
            err = TestMakeSureThatHolidayScheduleWasDeleted_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Cleanup the created user\n");
            err = TestCleanupTheCreatedUser_9();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), 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));
            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));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 10;

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

    CHIP_ERROR TestWaitForCommissionee_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }
    NSNumber * _Nonnull NumberOfHolidaySchedulesSupported;

    CHIP_ERROR TestThReadsNumberOfHolidaySchedulesSupportedAndSavesForFutureUse_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNumberOfHolidaySchedulesSupportedWithCompletion:^(
            NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads NumberOfHoliday SchedulesSupported and saves for future use. Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("numberOfHolidaySchedulesSupported", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("numberOfHolidaySchedulesSupported", [value unsignedCharValue], 255U));
            {
                NumberOfHolidaySchedulesSupported = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateHolidayScheduleWith1Index_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.localStartTime = [NSNumber numberWithUnsignedInt:20UL];
        params.localEndTime = [NSNumber numberWithUnsignedInt:30UL];
        params.operatingMode = [NSNumber numberWithUnsignedChar:0U];
        [cluster setHolidayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Holiday schedule with 1 index Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGetHolidayScheduleWithHolidayIndexAs1_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:1U];
        [cluster getHolidayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetHolidayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Get Holiday Schedule with HolidayIndex as 1 Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.holidayIndex;
                                           VerifyOrReturn(CheckValue("HolidayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.localStartTime;
                                           VerifyOrReturn(CheckValue("LocalStartTime", actualValue, 20UL));
                                       }

                                       {
                                           id actualValue = values.localEndTime;
                                           VerifyOrReturn(CheckValue("LocalEndTime", actualValue, 30UL));
                                       }

                                       if (values.localEndTime != nil) {

                                           VerifyOrReturn(CheckConstraintMinValue<uint32_t>(
                                               "localEndTime", [values.localEndTime unsignedIntValue], 21UL));
                                       }

                                       {
                                           id actualValue = values.operatingMode;
                                           VerifyOrReturn(CheckValue("OperatingMode", actualValue, 0U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateHolidayScheduleWithInvalidOperatingMode_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.localStartTime = [NSNumber numberWithUnsignedInt:20UL];
        params.localEndTime = [NSNumber numberWithUnsignedInt:30UL];
        params.operatingMode = [NSNumber numberWithUnsignedChar:5U];
        [cluster setHolidayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"Create Holiday schedule with invalid operating mode Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_COMMAND));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGetHolidayScheduleWithInvalidHolidayIndex15_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:15U];
        [cluster getHolidayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetHolidayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Get Holiday Schedule with Invalid HolidayIndex 15. Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.holidayIndex;
                                           VerifyOrReturn(CheckValue("HolidayIndex", actualValue, 15U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 133U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGetHolidayScheduleWithTheNonScheduledHolidayIndex_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:10U];
        [cluster getHolidayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetHolidayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Get Holiday Schedule with the Non-scheduled HolidayIndex Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.holidayIndex;
                                           VerifyOrReturn(CheckValue("HolidayIndex", actualValue, 10U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 139U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearHolidayScheduleWith1Index_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:1U];
        [cluster clearHolidayScheduleWithParams:params
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Clear Holiday schedule with 1 index Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatHolidayScheduleWasDeleted_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:1U];
        [cluster getHolidayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetHolidayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Make sure that holiday schedule was deleted Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.holidayIndex;
                                           VerifyOrReturn(CheckValue("HolidayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 139U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCleanupTheCreatedUser_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster clearUserWithParams:params
                          completion:^(NSError * _Nullable err) {
                              NSLog(@"Cleanup the created user Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_DRLK_2_7 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_DRLK_2_7()
        : TestCommandBridge("Test_TC_DRLK_2_7")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_DRLK_2_7() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_DRLK_2_7\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_DRLK_2_7\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Create new user\n");
            err = TestCreateNewUser_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the user back and verify its fields\n");
            err = TestReadTheUserBackAndVerifyItsFields_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : TH reads NumberOfYearDay SchedulesSupportedPerUser attribute\n");
            if (ShouldSkip("DRLK.S.F0a && DRLK.S.A0015")) {
                NextTest();
                return;
            }
            err = TestThReadsNumberOfYearDaySchedulesSupportedPerUserAttribute_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH reads NumberOfTotalUsers Supported attribute\n");
            if (ShouldSkip("DRLK.S.F08 && DRLK.S.A0011")) {
                NextTest();
                return;
            }
            err = TestThReadsNumberOfTotalUsersSupportedAttribute_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH sends Set Year Day Schedule Command to DUT\n");
            if (ShouldSkip("DRLK.S.F0a && DRLK.S.C0e.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsSetYearDayScheduleCommandToDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : TH sends Get Year Day Schedule Command to DUT\n");
            if (ShouldSkip("DRLK.S.F0a && DRLK.S.C0f.Rsp && DRLK.S.C0f.Tx")) {
                NextTest();
                return;
            }
            err = TestThSendsGetYearDayScheduleCommandToDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH send Set Year Day Schedule Command to DUT\n");
            if (ShouldSkip("DRLK.S.C0e.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendSetYearDayScheduleCommandToDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : TH sends Get Year Day Schedule Command to DUT\n");
            if (ShouldSkip("DRLK.S.F0a && DRLK.S.C0f.Rsp && DRLK.S.C0f.Tx")) {
                NextTest();
                return;
            }
            err = TestThSendsGetYearDayScheduleCommandToDut_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Create a user with userIndex as 5\n");
            err = TestCreateAUserWithUserIndexAs5_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : TH sends Get Year Day Schedule Command to DUT\n");
            if (ShouldSkip("DRLK.S.F0a && DRLK.S.C0f.Rsp && DRLK.S.C0f.Tx")) {
                NextTest();
                return;
            }
            err = TestThSendsGetYearDayScheduleCommandToDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : TH sends Clear Year Day Schedule to DUT\n");
            if (ShouldSkip("DRLK.S.C10.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsClearYearDayScheduleToDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : TH sends Get Year Day Schedule Command to DUT\n");
            if (ShouldSkip("DRLK.S.F0a && DRLK.S.C0f.Rsp && DRLK.S.C0f.Tx && DRLK.S.C10.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsGetYearDayScheduleCommandToDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : TH sends Set Year Day Schedule Command to DUT\n");
            if (ShouldSkip("DRLK.S.C0e.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsSetYearDayScheduleCommandToDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : TH sends Get Year Day Schedule Command to DUT\n");
            if (ShouldSkip("DRLK.S.F0a && DRLK.S.C0f.Rsp && DRLK.S.C0f.Tx")) {
                NextTest();
                return;
            }
            err = TestThSendsGetYearDayScheduleCommandToDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : TH sends Clear Year Day Schedule to DUT\n");
            if (ShouldSkip("DRLK.S.F0a && DRLK.S.C10.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsClearYearDayScheduleToDut_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Clear a year day schedule for the first user\n");
            if (ShouldSkip("DRLK.S.F0a && DRLK.S.C10.Rsp")) {
                NextTest();
                return;
            }
            err = TestClearAYearDayScheduleForTheFirstUser_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Cleanup the created user\n");
            err = TestCleanupTheCreatedUser_17();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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_INVALID_COMMAND));
            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), 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));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_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;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 18;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestCreateNewUser_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userName = @"xxx";
        params.userUniqueID = [NSNumber numberWithUnsignedInt:6452UL];
        params.userStatus = [NSNumber numberWithUnsignedChar:1U];
        params.userType = [NSNumber numberWithUnsignedChar:0U];
        params.credentialRule = [NSNumber numberWithUnsignedChar:0U];
        [cluster setUserWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"Create new user Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheUserBackAndVerifyItsFields_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the user back and verify its fields Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNonNull("UserName", actualValue));
                                VerifyOrReturn(CheckValueAsString("UserName", actualValue, @"xxx"));
                            }

                            {
                                id actualValue = values.userUniqueID;
                                VerifyOrReturn(CheckValueNonNull("UserUniqueID", actualValue));
                                VerifyOrReturn(CheckValue("UserUniqueID", actualValue, 6452UL));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNonNull("UserStatus", actualValue));
                                VerifyOrReturn(CheckValue("UserStatus", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNonNull("UserType", actualValue));
                                VerifyOrReturn(CheckValue("UserType", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNonNull("CredentialRule", actualValue));
                                VerifyOrReturn(CheckValue("CredentialRule", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("Credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("CreatorFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("CreatorFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("LastModifiedFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("LastModifiedFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("NextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull NumberOfYearDaySchedulesSupportedPerUser;

    CHIP_ERROR TestThReadsNumberOfYearDaySchedulesSupportedPerUserAttribute_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNumberOfYearDaySchedulesSupportedPerUserWithCompletion:^(
            NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads NumberOfYearDay SchedulesSupportedPerUser attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(
                CheckConstraintMinValue<uint8_t>("numberOfYearDaySchedulesSupportedPerUser", [value unsignedCharValue], 0U));
            VerifyOrReturn(
                CheckConstraintMaxValue<uint8_t>("numberOfYearDaySchedulesSupportedPerUser", [value unsignedCharValue], 255U));
            {
                NumberOfYearDaySchedulesSupportedPerUser = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull NumberOfTotalUsersSupported;

    CHIP_ERROR TestThReadsNumberOfTotalUsersSupportedAttribute_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNumberOfTotalUsersSupportedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads NumberOfTotalUsers Supported attribute Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("numberOfTotalUsersSupported", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("numberOfTotalUsersSupported", [value unsignedShortValue], 65534U));
            {
                NumberOfTotalUsersSupported = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsSetYearDayScheduleCommandToDut_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.localStartTime = [NSNumber numberWithUnsignedInt:960UL];
        params.localEndTime = [NSNumber numberWithUnsignedInt:1980UL];
        [cluster setYearDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"TH sends Set Year Day Schedule Command to DUT Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsGetYearDayScheduleCommandToDut_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"TH sends Get Year Day Schedule Command to DUT Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("YearDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.localStartTime;
                                           VerifyOrReturn(CheckValue("LocalStartTime", actualValue, 960UL));
                                       }

                                       {
                                           id actualValue = values.localEndTime;
                                           VerifyOrReturn(CheckValue("LocalEndTime", actualValue, 1980UL));
                                       }

                                       if (values.localEndTime != nil) {

                                           VerifyOrReturn(CheckConstraintMinValue<uint32_t>(
                                               "localEndTime", [values.localEndTime unsignedIntValue], 961UL));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendSetYearDayScheduleCommandToDut_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:15U];
        params.localStartTime = [NSNumber numberWithUnsignedInt:1020UL];
        params.localEndTime = [NSNumber numberWithUnsignedInt:2040UL];
        [cluster setYearDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"TH send Set Year Day Schedule Command to DUT Error: %@", err);

                                       VerifyOrReturn(CheckValue("status",
                                           err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                         : EMBER_ZCL_STATUS_FAILURE)
                                               : 0,
                                           EMBER_ZCL_STATUS_INVALID_COMMAND));
                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsGetYearDayScheduleCommandToDut_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:15U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"TH sends Get Year Day Schedule Command to DUT Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("YearDayIndex", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("UserIndex", actualValue, 15U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 133U));
                                       }

                                       VerifyOrReturn(CheckConstraintHasValue("localStartTime", values.localStartTime, false));
                                       if (values.localStartTime != nil) {
                                       }

                                       VerifyOrReturn(CheckConstraintHasValue("localEndTime", values.localEndTime, false));
                                       if (values.localEndTime != nil) {
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateAUserWithUserIndexAs5_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:5U];
        params.userName = @"xxx";
        params.userUniqueID = [NSNumber numberWithUnsignedInt:6452UL];
        params.userStatus = [NSNumber numberWithUnsignedChar:1U];
        params.userType = [NSNumber numberWithUnsignedChar:0U];
        params.credentialRule = [NSNumber numberWithUnsignedChar:0U];
        [cluster setUserWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"Create a user with userIndex as 5 Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsGetYearDayScheduleCommandToDut_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NumberOfYearDaySchedulesSupportedPerUser copy];
        params.userIndex = [NSNumber numberWithUnsignedShort:5U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"TH sends Get Year Day Schedule Command to DUT Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(
                                               CheckValue("YearDayIndex", actualValue, NumberOfYearDaySchedulesSupportedPerUser));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("UserIndex", actualValue, 5U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 139U));
                                       }

                                       VerifyOrReturn(CheckConstraintHasValue("localStartTime", values.localStartTime, false));
                                       if (values.localStartTime != nil) {
                                       }

                                       VerifyOrReturn(CheckConstraintHasValue("localEndTime", values.localEndTime, false));
                                       if (values.localEndTime != nil) {
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsClearYearDayScheduleToDut_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster clearYearDayScheduleWithParams:params
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"TH sends Clear Year Day Schedule to DUT Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsGetYearDayScheduleCommandToDut_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"TH sends Get Year Day Schedule Command to DUT Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("YearDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 139U));
                                       }

                                       VerifyOrReturn(CheckConstraintHasValue("localStartTime", values.localStartTime, false));
                                       if (values.localStartTime != nil) {
                                       }

                                       VerifyOrReturn(CheckConstraintHasValue("localEndTime", values.localEndTime, false));
                                       if (values.localEndTime != nil) {
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsSetYearDayScheduleCommandToDut_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.localStartTime = [NSNumber numberWithUnsignedInt:1080UL];
        params.localEndTime = [NSNumber numberWithUnsignedInt:2100UL];
        [cluster setYearDayScheduleWithParams:params
                                   completion:^(NSError * _Nullable err) {
                                       NSLog(@"TH sends Set Year Day Schedule Command to DUT Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsGetYearDayScheduleCommandToDut_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getYearDayScheduleWithParams:params
                                   completion:^(MTRDoorLockClusterGetYearDayScheduleResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"TH sends Get Year Day Schedule Command to DUT Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.yearDayIndex;
                                           VerifyOrReturn(CheckValue("YearDayIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.userIndex;
                                           VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                                       }

                                       {
                                           id actualValue = values.status;
                                           VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                                       }

                                       {
                                           id actualValue = values.localStartTime;
                                           VerifyOrReturn(CheckValue("LocalStartTime", actualValue, 1080UL));
                                       }

                                       {
                                           id actualValue = values.localEndTime;
                                           VerifyOrReturn(CheckValue("LocalEndTime", actualValue, 2100UL));
                                       }

                                       if (values.localEndTime != nil) {

                                           VerifyOrReturn(CheckConstraintMinValue<uint32_t>(
                                               "localEndTime", [values.localEndTime unsignedIntValue], 1081UL));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsClearYearDayScheduleToDut_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:0U];
        [cluster
            clearYearDayScheduleWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"TH sends Clear Year Day Schedule to DUT Error: %@", err);

                                    VerifyOrReturn(CheckValue("status",
                                        err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                      : EMBER_ZCL_STATUS_FAILURE)
                                            : 0,
                                        EMBER_ZCL_STATUS_INVALID_COMMAND));
                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearAYearDayScheduleForTheFirstUser_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:1U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster clearYearDayScheduleWithParams:params
                                     completion:^(NSError * _Nullable err) {
                                         NSLog(@"Clear a year day schedule for the first user Error: %@", err);

                                         VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCleanupTheCreatedUser_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster clearUserWithParams:params
                          completion:^(NSError * _Nullable err) {
                              NSLog(@"Cleanup the created user Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_DRLK_2_9 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_DRLK_2_9()
        : TestCommandBridge("Test_TC_DRLK_2_9")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_DRLK_2_9() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_DRLK_2_9\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_DRLK_2_9\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Create new user with default parameters\n");
            err = TestCreateNewUserWithDefaultParameters_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the user back and verify its fields\n");
            err = TestReadTheUserBackAndVerifyItsFields_2();
            break;
        case 3:
            ChipLogProgress(
                chipTool, " ***** Test Step 3 : TH reads NumberOfTotalUsersSupported attribute and saves for future use.\n");
            if (ShouldSkip("DRLK.S.F08 && DRLK.S.A0011")) {
                NextTest();
                return;
            }
            err = TestThReadsNumberOfTotalUsersSupportedAttributeAndSavesForFutureUse_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH sends Set Credential Command to DUT\n");
            if (ShouldSkip("DRLK.S.F08 && DRLK.S.C22.Rsp && DRLK.S.C23.Tx")) {
                NextTest();
                return;
            }
            err = TestThSendsSetCredentialCommandToDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH sends Get Credential Status Command\n");
            if (ShouldSkip("DRLK.S.F08 && DRLK.S.C24.Rsp && DRLK.S.C25.Tx")) {
                NextTest();
                return;
            }
            err = TestThSendsGetCredentialStatusCommand_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : TH sends Set Credential Command to DUT\n");
            if (ShouldSkip("DRLK.S.F08 && DRLK.S.C22.Rsp && DRLK.S.C23.Tx")) {
                NextTest();
                return;
            }
            err = TestThSendsSetCredentialCommandToDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH sends Set Credential Command to DUT\n");
            if (ShouldSkip("DRLK.S.F08 && DRLK.S.C22.Rsp && DRLK.S.C23.Tx")) {
                NextTest();
                return;
            }
            err = TestThSendsSetCredentialCommandToDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool,
                " ***** Test Step 8 : TH sends Set Credential Command to DUT and Verify that the DUT sends Set Credential Response "
                "command with status as DUPLICATE or OCCUPIED\n");
            if (ShouldSkip("PICS_USER_PROMPT && DRLK.S.F08 && DRLK.S.C22.Rsp && DRLK.S.C23.Tx")) {
                NextTest();
                return;
            }
            err = TestThSendsSetCredentialCommandToDutAndVerifyThatTheDutSendsSetCredentialResponseCommandWithStatusAsDuplicateOrOccupied_8();
            break;
        case 9:
            ChipLogProgress(chipTool,
                " ***** Test Step 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\n");
            if (ShouldSkip("PICS_USER_PROMPT && DRLK.S.F08 && DRLK.S.C22.Rsp && DRLK.S.C23.Tx")) {
                NextTest();
                return;
            }
            err = TestThSendsSetCredentialCommandToDutAndVerifyThatTheDutSendsSetCredentialResponseCommandWithResponseAsOccupiedIfTheCredentialIndexIsRepeated_9();
            break;
        case 10:
            ChipLogProgress(chipTool,
                " ***** Test Step 10 : TH sends Set Credential Command to DUT and Verify that the DUT sends Set Credential "
                "Response command with response as OCCUPIED if the CredentialIndex is repeated\n");
            if (ShouldSkip("PICS_USER_PROMPT && DRLK.S.F08 && DRLK.S.C22.Rsp && DRLK.S.C23.Tx")) {
                NextTest();
                return;
            }
            err = TestThSendsSetCredentialCommandToDutAndVerifyThatTheDutSendsSetCredentialResponseCommandWithResponseAsOccupiedIfTheCredentialIndexIsRepeated_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : TH sends Clear Credential Command to DUT\n");
            if (ShouldSkip("DRLK.S.F08 && DRLK.S.C26.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsClearCredentialCommandToDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : TH sends Get Credential Status Command to DUT\n");
            if (ShouldSkip("DRLK.S.F08 && DRLK.S.C24.Rsp && DRLK.S.C25.Tx")) {
                NextTest();
                return;
            }
            err = TestThSendsGetCredentialStatusCommandToDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : TH sends Set User Command to DUT\n");
            if (ShouldSkip("DRLK.S.F08 && DRLK.S.C1a.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsSetUserCommandToDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : TH sends Set Credential Command to DUT\n");
            if (ShouldSkip("DRLK.S.F08 && DRLK.S.C22.Rsp && DRLK.S.C23.Tx")) {
                NextTest();
                return;
            }
            err = TestThSendsSetCredentialCommandToDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : TH sends Clear Credential Command to DUT\n");
            if (ShouldSkip("DRLK.S.F08 && DRLK.S.C26.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsClearCredentialCommandToDut_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : TH sends Get Credential Status Command\n");
            if (ShouldSkip("DRLK.S.F08 && DRLK.S.C24.Rsp && DRLK.S.C25.Tx")) {
                NextTest();
                return;
            }
            err = TestThSendsGetCredentialStatusCommand_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : TH sends Get Credential Status Command\n");
            if (ShouldSkip("DRLK.S.F08 && DRLK.S.C24.Rsp && DRLK.S.C25.Tx")) {
                NextTest();
                return;
            }
            err = TestThSendsGetCredentialStatusCommand_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : TH sends Clear Credential Command to DUT\n");
            if (ShouldSkip("DRLK.S.F08 && DRLK.S.C26.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsClearCredentialCommandToDut_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Cleanup the first created user\n");
            err = TestCleanupTheFirstCreatedUser_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Cleanup the second created user\n");
            err = TestCleanupTheSecondCreatedUser_20();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 21;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestCreateNewUserWithDefaultParameters_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userName = @"xxx";
        params.userUniqueID = [NSNumber numberWithUnsignedInt:6452UL];
        params.userStatus = [NSNumber numberWithUnsignedChar:1U];
        params.userType = [NSNumber numberWithUnsignedChar:0U];
        params.credentialRule = [NSNumber numberWithUnsignedChar:0U];
        [cluster setUserWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"Create new user with default parameters Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheUserBackAndVerifyItsFields_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                        completion:^(MTRDoorLockClusterGetUserResponseParams * _Nullable values, NSError * _Nullable err) {
                            NSLog(@"Read the user back and verify its fields Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            {
                                id actualValue = values.userIndex;
                                VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userName;
                                VerifyOrReturn(CheckValueNonNull("UserName", actualValue));
                                VerifyOrReturn(CheckValueAsString("UserName", actualValue, @"xxx"));
                            }

                            {
                                id actualValue = values.userUniqueID;
                                VerifyOrReturn(CheckValueNonNull("UserUniqueID", actualValue));
                                VerifyOrReturn(CheckValue("UserUniqueID", actualValue, 6452UL));
                            }

                            {
                                id actualValue = values.userStatus;
                                VerifyOrReturn(CheckValueNonNull("UserStatus", actualValue));
                                VerifyOrReturn(CheckValue("UserStatus", actualValue, 1U));
                            }

                            {
                                id actualValue = values.userType;
                                VerifyOrReturn(CheckValueNonNull("UserType", actualValue));
                                VerifyOrReturn(CheckValue("UserType", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentialRule;
                                VerifyOrReturn(CheckValueNonNull("CredentialRule", actualValue));
                                VerifyOrReturn(CheckValue("CredentialRule", actualValue, 0U));
                            }

                            {
                                id actualValue = values.credentials;
                                VerifyOrReturn(CheckValueNull("Credentials", actualValue));
                            }

                            {
                                id actualValue = values.creatorFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("CreatorFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("CreatorFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.lastModifiedFabricIndex;
                                VerifyOrReturn(CheckValueNonNull("LastModifiedFabricIndex", actualValue));
                                VerifyOrReturn(CheckValue("LastModifiedFabricIndex", actualValue, 1U));
                            }

                            {
                                id actualValue = values.nextUserIndex;
                                VerifyOrReturn(CheckValueNull("NextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull NumberOfTotalUsersSupported;

    CHIP_ERROR TestThReadsNumberOfTotalUsersSupportedAttributeAndSavesForFutureUse_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNumberOfTotalUsersSupportedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads NumberOfTotalUsersSupported attribute and saves for future use. Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("numberOfTotalUsersSupported", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("numberOfTotalUsersSupported", [value unsignedShortValue], 65534U));
            {
                NumberOfTotalUsersSupported = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsSetCredentialCommandToDut_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        params.credentialData = [[NSData alloc] initWithBytes:"123456" length:6];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"TH sends Set Credential Command to DUT Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("NextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("NextCredentialIndex", actualValue, 2U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsGetCredentialStatusCommand_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        [cluster getCredentialStatusWithParams:params
                                    completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                        NSError * _Nullable err) {
                                        NSLog(@"TH sends Get Credential Status Command Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        VerifyOrReturn(CheckConstraintType("credentialExists", "boolean", "boolean"));
                                        {
                                            id actualValue = values.userIndex;
                                            VerifyOrReturn(CheckValueNonNull("UserIndex", actualValue));
                                            VerifyOrReturn(CheckValue("UserIndex", actualValue, 1U));
                                        }

                                        {
                                            id actualValue = values.creatorFabricIndex;
                                            VerifyOrReturn(CheckValueNonNull("CreatorFabricIndex", actualValue));
                                            VerifyOrReturn(CheckValue("CreatorFabricIndex", actualValue, 1U));
                                        }

                                        {
                                            id actualValue = values.lastModifiedFabricIndex;
                                            VerifyOrReturn(CheckValueNonNull("LastModifiedFabricIndex", actualValue));
                                            VerifyOrReturn(CheckValue("LastModifiedFabricIndex", actualValue, 1U));
                                        }

                                        {
                                            id actualValue = values.nextCredentialIndex;
                                            VerifyOrReturn(CheckValueNull("NextCredentialIndex", actualValue));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsSetCredentialCommandToDut_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:2U];

        params.credentialData = [[NSData alloc] initWithBytes:"4321" length:4];
        params.userIndex = nil;
        params.userStatus = [NSNumber numberWithUnsignedChar:5U];
        params.userType = [NSNumber numberWithUnsignedChar:10U];
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"TH sends Set Credential Command to DUT Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 133U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("NextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("NextCredentialIndex", actualValue, 3U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsSetCredentialCommandToDut_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:2U];

        params.credentialData = [[NSData alloc] initWithBytes:"123456" length:6];
        params.userIndex = nil;
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"TH sends Set Credential Command to DUT Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 2U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("NextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("NextCredentialIndex", actualValue, 3U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestThSendsSetCredentialCommandToDutAndVerifyThatTheDutSendsSetCredentialResponseCommandWithStatusAsDuplicateOrOccupied_8()
    {

        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("alpha", value);
    }

    CHIP_ERROR
    TestThSendsSetCredentialCommandToDutAndVerifyThatTheDutSendsSetCredentialResponseCommandWithResponseAsOccupiedIfTheCredentialIndexIsRepeated_9()
    {

        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("alpha", value);
    }

    CHIP_ERROR
    TestThSendsSetCredentialCommandToDutAndVerifyThatTheDutSendsSetCredentialResponseCommandWithResponseAsOccupiedIfTheCredentialIndexIsRepeated_10()
    {

        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("alpha", value);
    }

    CHIP_ERROR TestThSendsClearCredentialCommandToDut_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        [cluster clearCredentialWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"TH sends Clear Credential Command to DUT Error: %@", err);

                                    VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsGetCredentialStatusCommandToDut_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        [cluster getCredentialStatusWithParams:params
                                    completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                        NSError * _Nullable err) {
                                        NSLog(@"TH sends Get Credential Status Command to DUT Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = values.credentialExists;
                                            VerifyOrReturn(CheckValue("CredentialExists", actualValue, false));
                                        }

                                        {
                                            id actualValue = values.userIndex;
                                            VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.creatorFabricIndex;
                                            VerifyOrReturn(CheckValueNull("CreatorFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.lastModifiedFabricIndex;
                                            VerifyOrReturn(CheckValueNull("LastModifiedFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.nextCredentialIndex;
                                            VerifyOrReturn(CheckValueNull("NextCredentialIndex", actualValue));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsSetUserCommandToDut_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.userIndex = [NSNumber numberWithUnsignedShort:2U];
        params.userName = @"xxx";
        params.userUniqueID = [NSNumber numberWithUnsignedInt:6452UL];
        params.userStatus = [NSNumber numberWithUnsignedChar:1U];
        params.userType = [NSNumber numberWithUnsignedChar:0U];
        params.credentialRule = [NSNumber numberWithUnsignedChar:0U];
        [cluster setUserWithParams:params
                        completion:^(NSError * _Nullable err) {
                            NSLog(@"TH sends Set User Command to DUT Error: %@", err);

                            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsSetCredentialCommandToDut_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
        params.operationType = [NSNumber numberWithUnsignedChar:0U];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        params.credentialData = [[NSData alloc] initWithBytes:"123456" length:6];
        params.userIndex = [NSNumber numberWithUnsignedShort:2U];
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                         completion:^(MTRDoorLockClusterSetCredentialResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"TH sends Set Credential Command to DUT Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.userIndex;
                                 VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                             }

                             {
                                 id actualValue = values.nextCredentialIndex;
                                 VerifyOrReturn(CheckValueNonNull("NextCredentialIndex", actualValue));
                                 VerifyOrReturn(CheckValue("NextCredentialIndex", actualValue, 2U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsClearCredentialCommandToDut_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:65534U];

        [cluster clearCredentialWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"TH sends Clear Credential Command to DUT Error: %@", err);

                                    VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsGetCredentialStatusCommand_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:65534U];

        [cluster getCredentialStatusWithParams:params
                                    completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                        NSError * _Nullable err) {
                                        NSLog(@"TH sends Get Credential Status Command Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = values.credentialExists;
                                            VerifyOrReturn(CheckValue("CredentialExists", actualValue, false));
                                        }

                                        {
                                            id actualValue = values.userIndex;
                                            VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.creatorFabricIndex;
                                            VerifyOrReturn(CheckValueNull("CreatorFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.lastModifiedFabricIndex;
                                            VerifyOrReturn(CheckValueNull("LastModifiedFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.nextCredentialIndex;
                                            VerifyOrReturn(CheckValueNull("NextCredentialIndex", actualValue));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsGetCredentialStatusCommand_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        [cluster getCredentialStatusWithParams:params
                                    completion:^(MTRDoorLockClusterGetCredentialStatusResponseParams * _Nullable values,
                                        NSError * _Nullable err) {
                                        NSLog(@"TH sends Get Credential Status Command Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = values.credentialExists;
                                            VerifyOrReturn(CheckValue("CredentialExists", actualValue, false));
                                        }

                                        {
                                            id actualValue = values.userIndex;
                                            VerifyOrReturn(CheckValueNull("UserIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.creatorFabricIndex;
                                            VerifyOrReturn(CheckValueNull("CreatorFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.lastModifiedFabricIndex;
                                            VerifyOrReturn(CheckValueNull("LastModifiedFabricIndex", actualValue));
                                        }

                                        {
                                            id actualValue = values.nextCredentialIndex;
                                            VerifyOrReturn(CheckValueNull("NextCredentialIndex", actualValue));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsClearCredentialCommandToDut_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
        params.credential = [[MTRDoorLockClusterCredentialStruct alloc] init];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:8U];
        ((MTRDoorLockClusterCredentialStruct *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:2U];

        [cluster clearCredentialWithParams:params
                                completion:^(NSError * _Nullable err) {
                                    NSLog(@"TH sends Clear Credential Command to DUT Error: %@", err);

                                    VerifyOrReturn(CheckValue("status",
                                        err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code
                                                                                                      : EMBER_ZCL_STATUS_FAILURE)
                                            : 0,
                                        EMBER_ZCL_STATUS_INVALID_COMMAND));
                                    NextTest();
                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCleanupTheFirstCreatedUser_19()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster clearUserWithParams:params
                          completion:^(NSError * _Nullable err) {
                              NSLog(@"Cleanup the first created user Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCleanupTheSecondCreatedUser_20()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:2U];
        [cluster clearUserWithParams:params
                          completion:^(NSError * _Nullable err) {
                              NSLog(@"Cleanup the second created user Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }
};

class TestGroupsCluster : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestGroupsCluster()
        : TestCommandBridge("TestGroupsCluster")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestGroupsCluster() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestGroupsCluster\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestGroupsCluster\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : View Group 0 (invalid)\n");
            err = TestViewGroup0Invalid_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : View First Group (not found)\n");
            err = TestViewFirstGroupNotFound_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Add First Group (no keys)\n");
            err = TestAddFirstGroupNoKeys_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Add KeySet\n");
            err = TestAddKeySet_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Write Group Keys\n");
            err = TestWriteGroupKeys_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Add First Group (new)\n");
            err = TestAddFirstGroupNew_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : View First Group (new)\n");
            err = TestViewFirstGroupNew_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : View Second Group (not found)\n");
            err = TestViewSecondGroupNotFound_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Get Group Membership 1 (all)\n");
            err = TestGetGroupMembership1All_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Add Second Group (new)\n");
            err = TestAddSecondGroupNew_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : View Second Group (new)\n");
            err = TestViewSecondGroupNew_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : View Group 3 (not found)\n");
            err = TestViewGroup3NotFound_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : View First Group (existing)\n");
            err = TestViewFirstGroupExisting_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : View Second Group (existing)\n");
            err = TestViewSecondGroupExisting_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Get Group Membership 2\n");
            err = TestGetGroupMembership2_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Remove Group 0 (invalid)\n");
            err = TestRemoveGroup0Invalid_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Remove Group 4 (not found)\n");
            err = TestRemoveGroup4NotFound_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Remove Second Group (existing)\n");
            err = TestRemoveSecondGroupExisting_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : View First Group (not removed)\n");
            err = TestViewFirstGroupNotRemoved_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : View Second Group (removed)\n");
            err = TestViewSecondGroupRemoved_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Get Group Membership 3\n");
            err = TestGetGroupMembership3_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : Remove All\n");
            err = TestRemoveAll_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : View First Group (removed)\n");
            err = TestViewFirstGroupRemoved_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : View Second Group (still removed)\n");
            err = TestViewSecondGroupStillRemoved_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : View Group 3 (removed)\n");
            err = TestViewGroup3Removed_25();
            break;
        case 26:
            ChipLogProgress(chipTool, " ***** Test Step 26 : Get Group Membership 4\n");
            err = TestGetGroupMembership4_26();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            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));
            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));
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 27;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestViewGroup0Invalid_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
        params.groupID = [NSNumber numberWithUnsignedShort:0U];
        [cluster viewGroupWithParams:params
                          completion:^(MTRGroupsClusterViewGroupResponseParams * _Nullable values, NSError * _Nullable err) {
                              NSLog(@"View Group 0 (invalid) Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              {
                                  id actualValue = values.status;
                                  VerifyOrReturn(CheckValue("Status", actualValue, 135U));
                              }

                              {
                                  id actualValue = values.groupID;
                                  VerifyOrReturn(CheckValue("GroupID", actualValue, 0U));
                              }

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestViewFirstGroupNotFound_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
        params.groupID = [NSNumber numberWithUnsignedShort:257U];
        [cluster viewGroupWithParams:params
                          completion:^(MTRGroupsClusterViewGroupResponseParams * _Nullable values, NSError * _Nullable err) {
                              NSLog(@"View First Group (not found) Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              {
                                  id actualValue = values.status;
                                  VerifyOrReturn(CheckValue("Status", actualValue, 139U));
                              }

                              {
                                  id actualValue = values.groupID;
                                  VerifyOrReturn(CheckValue("GroupID", actualValue, 257U));
                              }

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestAddFirstGroupNoKeys_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterAddGroupParams alloc] init];
        params.groupID = [NSNumber numberWithUnsignedShort:257U];
        params.groupName = @"Group #1";
        [cluster addGroupWithParams:params
                         completion:^(MTRGroupsClusterAddGroupResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Add First Group (no keys) Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 126U));
                             }

                             {
                                 id actualValue = values.groupID;
                                 VerifyOrReturn(CheckValue("GroupID", actualValue, 257U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestAddKeySet_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                              endpointID:@(0)
                                                                                   queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupKeyManagementClusterKeySetWriteParams alloc] init];
        params.groupKeySet = [[MTRGroupKeyManagementClusterGroupKeySetStruct alloc] init];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).groupKeySetID =
            [NSNumber numberWithUnsignedShort:417U];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).groupKeySecurityPolicy =
            [NSNumber numberWithUnsignedChar:0U];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochKey0 =
            [[NSData alloc] initWithBytes:"\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257" length:16];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochStartTime0 =
            [NSNumber numberWithUnsignedLongLong:1110000ULL];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochKey1 =
            [[NSData alloc] initWithBytes:"\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277" length:16];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochStartTime1 =
            [NSNumber numberWithUnsignedLongLong:1110001ULL];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochKey2 =
            [[NSData alloc] initWithBytes:"\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317" length:16];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochStartTime2 =
            [NSNumber numberWithUnsignedLongLong:1110002ULL];

        [cluster keySetWriteWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"Add KeySet Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteGroupKeys_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                              endpointID:@(0)
                                                                                   queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id groupKeyMapArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRGroupKeyManagementClusterGroupKeyMapStruct alloc] init];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[0]).groupId = [NSNumber numberWithUnsignedShort:257U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[0]).groupKeySetID = [NSNumber numberWithUnsignedShort:417U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[1] = [[MTRGroupKeyManagementClusterGroupKeyMapStruct alloc] init];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[1]).groupId = [NSNumber numberWithUnsignedShort:258U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[1]).groupKeySetID = [NSNumber numberWithUnsignedShort:417U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[1]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            groupKeyMapArgument = temp_0;
        }
        [cluster writeAttributeGroupKeyMapWithValue:groupKeyMapArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write Group Keys Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestAddFirstGroupNew_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterAddGroupParams alloc] init];
        params.groupID = [NSNumber numberWithUnsignedShort:257U];
        params.groupName = @"Group #1";
        [cluster addGroupWithParams:params
                         completion:^(MTRGroupsClusterAddGroupResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Add First Group (new) Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.groupID;
                                 VerifyOrReturn(CheckValue("GroupID", actualValue, 257U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestViewFirstGroupNew_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
        params.groupID = [NSNumber numberWithUnsignedShort:257U];
        [cluster viewGroupWithParams:params
                          completion:^(MTRGroupsClusterViewGroupResponseParams * _Nullable values, NSError * _Nullable err) {
                              NSLog(@"View First Group (new) Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              {
                                  id actualValue = values.status;
                                  VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                              }

                              {
                                  id actualValue = values.groupID;
                                  VerifyOrReturn(CheckValue("GroupID", actualValue, 257U));
                              }

                              {
                                  id actualValue = values.groupName;
                                  VerifyOrReturn(CheckValueAsString("GroupName", actualValue, @"Group #1"));
                              }

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestViewSecondGroupNotFound_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
        params.groupID = [NSNumber numberWithUnsignedShort:258U];
        [cluster viewGroupWithParams:params
                          completion:^(MTRGroupsClusterViewGroupResponseParams * _Nullable values, NSError * _Nullable err) {
                              NSLog(@"View Second Group (not found) Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              {
                                  id actualValue = values.status;
                                  VerifyOrReturn(CheckValue("Status", actualValue, 139U));
                              }

                              {
                                  id actualValue = values.groupID;
                                  VerifyOrReturn(CheckValue("GroupID", actualValue, 258U));
                              }

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGetGroupMembership1All_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterGetGroupMembershipParams alloc] init];
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            params.groupList = temp_0;
        }
        [cluster getGroupMembershipWithParams:params
                                   completion:^(MTRGroupsClusterGetGroupMembershipResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Get Group Membership 1 (all) Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.capacity;
                                           VerifyOrReturn(CheckValueNull("Capacity", actualValue));
                                       }

                                       {
                                           id actualValue = values.groupList;
                                           VerifyOrReturn(CheckValue("GroupList", [actualValue count], static_cast<uint32_t>(1)));
                                           VerifyOrReturn(CheckValue("", actualValue[0], 257U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestAddSecondGroupNew_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterAddGroupParams alloc] init];
        params.groupID = [NSNumber numberWithUnsignedShort:258U];
        params.groupName = @"Group #2";
        [cluster addGroupWithParams:params
                         completion:^(MTRGroupsClusterAddGroupResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Add Second Group (new) Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.groupID;
                                 VerifyOrReturn(CheckValue("GroupID", actualValue, 258U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestViewSecondGroupNew_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
        params.groupID = [NSNumber numberWithUnsignedShort:258U];
        [cluster viewGroupWithParams:params
                          completion:^(MTRGroupsClusterViewGroupResponseParams * _Nullable values, NSError * _Nullable err) {
                              NSLog(@"View Second Group (new) Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              {
                                  id actualValue = values.status;
                                  VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                              }

                              {
                                  id actualValue = values.groupID;
                                  VerifyOrReturn(CheckValue("GroupID", actualValue, 258U));
                              }

                              {
                                  id actualValue = values.groupName;
                                  VerifyOrReturn(CheckValueAsString("GroupName", actualValue, @"Group #2"));
                              }

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestViewGroup3NotFound_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
        params.groupID = [NSNumber numberWithUnsignedShort:32767U];
        [cluster viewGroupWithParams:params
                          completion:^(MTRGroupsClusterViewGroupResponseParams * _Nullable values, NSError * _Nullable err) {
                              NSLog(@"View Group 3 (not found) Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              {
                                  id actualValue = values.status;
                                  VerifyOrReturn(CheckValue("Status", actualValue, 139U));
                              }

                              {
                                  id actualValue = values.groupID;
                                  VerifyOrReturn(CheckValue("GroupID", actualValue, 32767U));
                              }

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestViewFirstGroupExisting_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
        params.groupID = [NSNumber numberWithUnsignedShort:257U];
        [cluster viewGroupWithParams:params
                          completion:^(MTRGroupsClusterViewGroupResponseParams * _Nullable values, NSError * _Nullable err) {
                              NSLog(@"View First Group (existing) Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              {
                                  id actualValue = values.status;
                                  VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                              }

                              {
                                  id actualValue = values.groupID;
                                  VerifyOrReturn(CheckValue("GroupID", actualValue, 257U));
                              }

                              {
                                  id actualValue = values.groupName;
                                  VerifyOrReturn(CheckValueAsString("GroupName", actualValue, @"Group #1"));
                              }

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestViewSecondGroupExisting_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
        params.groupID = [NSNumber numberWithUnsignedShort:258U];
        [cluster viewGroupWithParams:params
                          completion:^(MTRGroupsClusterViewGroupResponseParams * _Nullable values, NSError * _Nullable err) {
                              NSLog(@"View Second Group (existing) Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              {
                                  id actualValue = values.status;
                                  VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                              }

                              {
                                  id actualValue = values.groupID;
                                  VerifyOrReturn(CheckValue("GroupID", actualValue, 258U));
                              }

                              {
                                  id actualValue = values.groupName;
                                  VerifyOrReturn(CheckValueAsString("GroupName", actualValue, @"Group #2"));
                              }

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGetGroupMembership2_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterGetGroupMembershipParams alloc] init];
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [NSNumber numberWithUnsignedShort:258U];
            temp_0[1] = [NSNumber numberWithUnsignedShort:259U];
            temp_0[2] = [NSNumber numberWithUnsignedShort:32767U];
            params.groupList = temp_0;
        }
        [cluster getGroupMembershipWithParams:params
                                   completion:^(MTRGroupsClusterGetGroupMembershipResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Get Group Membership 2 Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.capacity;
                                           VerifyOrReturn(CheckValueNull("Capacity", actualValue));
                                       }

                                       {
                                           id actualValue = values.groupList;
                                           VerifyOrReturn(CheckValue("GroupList", [actualValue count], static_cast<uint32_t>(1)));
                                           VerifyOrReturn(CheckValue("", actualValue[0], 258U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRemoveGroup0Invalid_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterRemoveGroupParams alloc] init];
        params.groupID = [NSNumber numberWithUnsignedShort:0U];
        [cluster removeGroupWithParams:params
                            completion:^(MTRGroupsClusterRemoveGroupResponseParams * _Nullable values, NSError * _Nullable err) {
                                NSLog(@"Remove Group 0 (invalid) Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                {
                                    id actualValue = values.status;
                                    VerifyOrReturn(CheckValue("Status", actualValue, 135U));
                                }

                                {
                                    id actualValue = values.groupID;
                                    VerifyOrReturn(CheckValue("GroupID", actualValue, 0U));
                                }

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRemoveGroup4NotFound_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterRemoveGroupParams alloc] init];
        params.groupID = [NSNumber numberWithUnsignedShort:260U];
        [cluster removeGroupWithParams:params
                            completion:^(MTRGroupsClusterRemoveGroupResponseParams * _Nullable values, NSError * _Nullable err) {
                                NSLog(@"Remove Group 4 (not found) Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                {
                                    id actualValue = values.status;
                                    VerifyOrReturn(CheckValue("Status", actualValue, 139U));
                                }

                                {
                                    id actualValue = values.groupID;
                                    VerifyOrReturn(CheckValue("GroupID", actualValue, 260U));
                                }

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRemoveSecondGroupExisting_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterRemoveGroupParams alloc] init];
        params.groupID = [NSNumber numberWithUnsignedShort:258U];
        [cluster removeGroupWithParams:params
                            completion:^(MTRGroupsClusterRemoveGroupResponseParams * _Nullable values, NSError * _Nullable err) {
                                NSLog(@"Remove Second Group (existing) Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                {
                                    id actualValue = values.status;
                                    VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                                }

                                {
                                    id actualValue = values.groupID;
                                    VerifyOrReturn(CheckValue("GroupID", actualValue, 258U));
                                }

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestViewFirstGroupNotRemoved_19()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
        params.groupID = [NSNumber numberWithUnsignedShort:257U];
        [cluster viewGroupWithParams:params
                          completion:^(MTRGroupsClusterViewGroupResponseParams * _Nullable values, NSError * _Nullable err) {
                              NSLog(@"View First Group (not removed) Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              {
                                  id actualValue = values.status;
                                  VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                              }

                              {
                                  id actualValue = values.groupID;
                                  VerifyOrReturn(CheckValue("GroupID", actualValue, 257U));
                              }

                              {
                                  id actualValue = values.groupName;
                                  VerifyOrReturn(CheckValueAsString("GroupName", actualValue, @"Group #1"));
                              }

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestViewSecondGroupRemoved_20()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
        params.groupID = [NSNumber numberWithUnsignedShort:258U];
        [cluster viewGroupWithParams:params
                          completion:^(MTRGroupsClusterViewGroupResponseParams * _Nullable values, NSError * _Nullable err) {
                              NSLog(@"View Second Group (removed) Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              {
                                  id actualValue = values.status;
                                  VerifyOrReturn(CheckValue("Status", actualValue, 139U));
                              }

                              {
                                  id actualValue = values.groupID;
                                  VerifyOrReturn(CheckValue("GroupID", actualValue, 258U));
                              }

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGetGroupMembership3_21()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterGetGroupMembershipParams alloc] init];
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [NSNumber numberWithUnsignedShort:1U];
            temp_0[1] = [NSNumber numberWithUnsignedShort:257U];
            temp_0[2] = [NSNumber numberWithUnsignedShort:258U];
            temp_0[3] = [NSNumber numberWithUnsignedShort:3U];
            params.groupList = temp_0;
        }
        [cluster getGroupMembershipWithParams:params
                                   completion:^(MTRGroupsClusterGetGroupMembershipResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Get Group Membership 3 Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.capacity;
                                           VerifyOrReturn(CheckValueNull("Capacity", actualValue));
                                       }

                                       {
                                           id actualValue = values.groupList;
                                           VerifyOrReturn(CheckValue("GroupList", [actualValue count], static_cast<uint32_t>(1)));
                                           VerifyOrReturn(CheckValue("", actualValue[0], 257U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRemoveAll_22()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster removeAllGroupsWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Remove All Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestViewFirstGroupRemoved_23()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
        params.groupID = [NSNumber numberWithUnsignedShort:257U];
        [cluster viewGroupWithParams:params
                          completion:^(MTRGroupsClusterViewGroupResponseParams * _Nullable values, NSError * _Nullable err) {
                              NSLog(@"View First Group (removed) Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              {
                                  id actualValue = values.status;
                                  VerifyOrReturn(CheckValue("Status", actualValue, 139U));
                              }

                              {
                                  id actualValue = values.groupID;
                                  VerifyOrReturn(CheckValue("GroupID", actualValue, 257U));
                              }

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestViewSecondGroupStillRemoved_24()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
        params.groupID = [NSNumber numberWithUnsignedShort:258U];
        [cluster viewGroupWithParams:params
                          completion:^(MTRGroupsClusterViewGroupResponseParams * _Nullable values, NSError * _Nullable err) {
                              NSLog(@"View Second Group (still removed) Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              {
                                  id actualValue = values.status;
                                  VerifyOrReturn(CheckValue("Status", actualValue, 139U));
                              }

                              {
                                  id actualValue = values.groupID;
                                  VerifyOrReturn(CheckValue("GroupID", actualValue, 258U));
                              }

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestViewGroup3Removed_25()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
        params.groupID = [NSNumber numberWithUnsignedShort:32767U];
        [cluster viewGroupWithParams:params
                          completion:^(MTRGroupsClusterViewGroupResponseParams * _Nullable values, NSError * _Nullable err) {
                              NSLog(@"View Group 3 (removed) Error: %@", err);

                              VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                              {
                                  id actualValue = values.status;
                                  VerifyOrReturn(CheckValue("Status", actualValue, 139U));
                              }

                              {
                                  id actualValue = values.groupID;
                                  VerifyOrReturn(CheckValue("GroupID", actualValue, 32767U));
                              }

                              NextTest();
                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGetGroupMembership4_26()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterGetGroupMembershipParams alloc] init];
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [NSNumber numberWithUnsignedShort:1U];
            temp_0[1] = [NSNumber numberWithUnsignedShort:257U];
            temp_0[2] = [NSNumber numberWithUnsignedShort:258U];
            temp_0[3] = [NSNumber numberWithUnsignedShort:3U];
            temp_0[4] = [NSNumber numberWithUnsignedShort:32767U];
            params.groupList = temp_0;
        }
        [cluster getGroupMembershipWithParams:params
                                   completion:^(MTRGroupsClusterGetGroupMembershipResponseParams * _Nullable values,
                                       NSError * _Nullable err) {
                                       NSLog(@"Get Group Membership 4 Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = values.capacity;
                                           VerifyOrReturn(CheckValueNull("Capacity", actualValue));
                                       }

                                       {
                                           id actualValue = values.groupList;
                                           VerifyOrReturn(CheckValue("GroupList", [actualValue count], static_cast<uint32_t>(0)));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }
};

class TestGroupKeyManagementCluster : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    TestGroupKeyManagementCluster()
        : TestCommandBridge("TestGroupKeyManagementCluster")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~TestGroupKeyManagementCluster() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: TestGroupKeyManagementCluster\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: TestGroupKeyManagementCluster\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : Read maxGroupsPerFabric\n");
            err = TestReadMaxGroupsPerFabric_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read maxGroupKeysPerFabric\n");
            err = TestReadMaxGroupKeysPerFabric_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : KeySet Write 1\n");
            err = TestKeySetWrite1_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : KeySet Write 2\n");
            err = TestKeySetWrite2_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : KeySet Read\n");
            err = TestKeySetRead_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Write Group Keys (invalid)\n");
            err = TestWriteGroupKeysInvalid_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Write Group Keys (too many)\n");
            err = TestWriteGroupKeysTooMany_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Write Group Keys\n");
            err = TestWriteGroupKeys_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Read Group Keys\n");
            err = TestReadGroupKeys_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Add Group 1\n");
            err = TestAddGroup1_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Add Group 2\n");
            err = TestAddGroup2_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Add Group 3\n");
            err = TestAddGroup3_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Add Group 4\n");
            err = TestAddGroup4_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Read GroupTable\n");
            err = TestReadGroupTable_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : KeySet Remove 1\n");
            err = TestKeySetRemove1_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : KeySet Read (removed)\n");
            err = TestKeySetReadRemoved_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : KeySet Read (not removed)\n");
            err = TestKeySetReadNotRemoved_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Remove Group 1\n");
            err = TestRemoveGroup1_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Read GroupTable 2\n");
            err = TestReadGroupTable2_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Remove All\n");
            err = TestRemoveAll_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Read GroupTable 3\n");
            err = TestReadGroupTable3_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : KeySet Remove 2\n");
            err = TestKeySetRemove2_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : KeySet Read (also removed)\n");
            err = TestKeySetReadAlsoRemoved_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : KeySet Write 1\n");
            err = TestKeySetWrite1_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : KeySet Write 2\n");
            err = TestKeySetWrite2_25();
            break;
        case 26:
            ChipLogProgress(chipTool, " ***** Test Step 26 : Map Group 1 and Group 2 to KeySet 1 and group 2 to KeySet 2\n");
            err = TestMapGroup1AndGroup2ToKeySet1AndGroup2ToKeySet2_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : Remove keyset 1\n");
            err = TestRemoveKeyset1_27();
            break;
        case 28:
            ChipLogProgress(chipTool, " ***** Test Step 28 : TH verifies GroupKeyMap entries for KeySet 1 have been removed\n");
            err = TestThVerifiesGroupKeyMapEntriesForKeySet1HaveBeenRemoved_28();
            break;
        case 29:
            ChipLogProgress(chipTool, " ***** Test Step 29 : Remove keyset 2\n");
            err = TestRemoveKeyset2_29();
            break;
        case 30:
            ChipLogProgress(chipTool, " ***** Test Step 30 : TH verifies GroupKeyMap entries for KeySet 2 have been removed\n");
            err = TestThVerifiesGroupKeyMapEntriesForKeySet2HaveBeenRemoved_30();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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_NOT_FOUND));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_NOT_FOUND));
            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));
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 31;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestReadMaxGroupsPerFabric_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                              endpointID:@(0)
                                                                                   queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxGroupsPerFabricWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read maxGroupsPerFabric Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("maxGroupsPerFabric", [value unsignedShortValue], 4U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadMaxGroupKeysPerFabric_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                              endpointID:@(0)
                                                                                   queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxGroupKeysPerFabricWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read maxGroupKeysPerFabric Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("maxGroupKeysPerFabric", [value unsignedShortValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestKeySetWrite1_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                              endpointID:@(0)
                                                                                   queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupKeyManagementClusterKeySetWriteParams alloc] init];
        params.groupKeySet = [[MTRGroupKeyManagementClusterGroupKeySetStruct alloc] init];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).groupKeySetID =
            [NSNumber numberWithUnsignedShort:417U];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).groupKeySecurityPolicy =
            [NSNumber numberWithUnsignedChar:0U];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochKey0 =
            [[NSData alloc] initWithBytes:"\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257" length:16];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochStartTime0 =
            [NSNumber numberWithUnsignedLongLong:1110000ULL];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochKey1 =
            [[NSData alloc] initWithBytes:"\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277" length:16];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochStartTime1 =
            [NSNumber numberWithUnsignedLongLong:1110001ULL];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochKey2 =
            [[NSData alloc] initWithBytes:"\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317" length:16];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochStartTime2 =
            [NSNumber numberWithUnsignedLongLong:1110002ULL];

        [cluster keySetWriteWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"KeySet Write 1 Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestKeySetWrite2_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                              endpointID:@(0)
                                                                                   queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupKeyManagementClusterKeySetWriteParams alloc] init];
        params.groupKeySet = [[MTRGroupKeyManagementClusterGroupKeySetStruct alloc] init];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).groupKeySetID =
            [NSNumber numberWithUnsignedShort:418U];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).groupKeySecurityPolicy =
            [NSNumber numberWithUnsignedChar:1U];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochKey0 =
            [[NSData alloc] initWithBytes:"\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337" length:16];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochStartTime0 =
            [NSNumber numberWithUnsignedLongLong:2110000ULL];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochKey1 =
            [[NSData alloc] initWithBytes:"\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357" length:16];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochStartTime1 =
            [NSNumber numberWithUnsignedLongLong:2110001ULL];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochKey2 =
            [[NSData alloc] initWithBytes:"\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377" length:16];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochStartTime2 =
            [NSNumber numberWithUnsignedLongLong:2110002ULL];

        [cluster keySetWriteWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"KeySet Write 2 Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestKeySetRead_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                              endpointID:@(0)
                                                                                   queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupKeyManagementClusterKeySetReadParams alloc] init];
        params.groupKeySetID = [NSNumber numberWithUnsignedShort:417U];
        [cluster
            keySetReadWithParams:params
                      completion:^(
                          MTRGroupKeyManagementClusterKeySetReadResponseParams * _Nullable values, NSError * _Nullable err) {
                          NSLog(@"KeySet Read Error: %@", err);

                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                          {
                              id actualValue = values.groupKeySet;
                              VerifyOrReturn(CheckValue("GroupKeySetID",
                                  ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).groupKeySetID, 417U));
                              VerifyOrReturn(CheckValue("GroupKeySecurityPolicy",
                                  ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).groupKeySecurityPolicy, 0U));
                              VerifyOrReturn(CheckValueNull(
                                  "EpochKey0", ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).epochKey0));
                              VerifyOrReturn(CheckValueNonNull("EpochStartTime0",
                                  ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).epochStartTime0));
                              VerifyOrReturn(CheckValue("EpochStartTime0",
                                  ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).epochStartTime0, 1110000ULL));
                              VerifyOrReturn(CheckValueNull(
                                  "EpochKey1", ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).epochKey1));
                              VerifyOrReturn(CheckValueNonNull("EpochStartTime1",
                                  ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).epochStartTime1));
                              VerifyOrReturn(CheckValue("EpochStartTime1",
                                  ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).epochStartTime1, 1110001ULL));
                              VerifyOrReturn(CheckValueNull(
                                  "EpochKey2", ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).epochKey2));
                              VerifyOrReturn(CheckValueNonNull("EpochStartTime2",
                                  ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).epochStartTime2));
                              VerifyOrReturn(CheckValue("EpochStartTime2",
                                  ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).epochStartTime2, 1110002ULL));
                          }

                          NextTest();
                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteGroupKeysInvalid_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                              endpointID:@(0)
                                                                                   queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id groupKeyMapArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRGroupKeyManagementClusterGroupKeyMapStruct alloc] init];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[0]).groupId = [NSNumber numberWithUnsignedShort:258U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[0]).groupKeySetID = [NSNumber numberWithUnsignedShort:0U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            groupKeyMapArgument = temp_0;
        }
        [cluster writeAttributeGroupKeyMapWithValue:groupKeyMapArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write Group Keys (invalid) Error: %@", err);

                                             VerifyOrReturn(CheckValue("status",
                                                 err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                         ? err.code
                                                         : EMBER_ZCL_STATUS_FAILURE)
                                                     : 0,
                                                 EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteGroupKeysTooMany_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                              endpointID:@(0)
                                                                                   queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id groupKeyMapArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRGroupKeyManagementClusterGroupKeyMapStruct alloc] init];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[0]).groupId = [NSNumber numberWithUnsignedShort:257U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[0]).groupKeySetID = [NSNumber numberWithUnsignedShort:417U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[1] = [[MTRGroupKeyManagementClusterGroupKeyMapStruct alloc] init];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[1]).groupId = [NSNumber numberWithUnsignedShort:257U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[1]).groupKeySetID = [NSNumber numberWithUnsignedShort:418U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[1]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[2] = [[MTRGroupKeyManagementClusterGroupKeyMapStruct alloc] init];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[2]).groupId = [NSNumber numberWithUnsignedShort:258U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[2]).groupKeySetID = [NSNumber numberWithUnsignedShort:417U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[2]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[3] = [[MTRGroupKeyManagementClusterGroupKeyMapStruct alloc] init];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[3]).groupId = [NSNumber numberWithUnsignedShort:258U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[3]).groupKeySetID = [NSNumber numberWithUnsignedShort:418U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[3]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[4] = [[MTRGroupKeyManagementClusterGroupKeyMapStruct alloc] init];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[4]).groupId = [NSNumber numberWithUnsignedShort:259U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[4]).groupKeySetID = [NSNumber numberWithUnsignedShort:417U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[4]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[5] = [[MTRGroupKeyManagementClusterGroupKeyMapStruct alloc] init];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[5]).groupId = [NSNumber numberWithUnsignedShort:259U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[5]).groupKeySetID = [NSNumber numberWithUnsignedShort:418U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[5]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            groupKeyMapArgument = temp_0;
        }
        [cluster writeAttributeGroupKeyMapWithValue:groupKeyMapArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write Group Keys (too many) Error: %@", err);

                                             VerifyOrReturn(CheckValue("status",
                                                 err ? ([err.domain isEqualToString:MTRInteractionErrorDomain]
                                                         ? err.code
                                                         : EMBER_ZCL_STATUS_FAILURE)
                                                     : 0,
                                                 EMBER_ZCL_STATUS_FAILURE));
                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteGroupKeys_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                              endpointID:@(0)
                                                                                   queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id groupKeyMapArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRGroupKeyManagementClusterGroupKeyMapStruct alloc] init];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[0]).groupId = [NSNumber numberWithUnsignedShort:257U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[0]).groupKeySetID = [NSNumber numberWithUnsignedShort:417U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[1] = [[MTRGroupKeyManagementClusterGroupKeyMapStruct alloc] init];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[1]).groupId = [NSNumber numberWithUnsignedShort:258U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[1]).groupKeySetID = [NSNumber numberWithUnsignedShort:418U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[1]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[2] = [[MTRGroupKeyManagementClusterGroupKeyMapStruct alloc] init];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[2]).groupId = [NSNumber numberWithUnsignedShort:259U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[2]).groupKeySetID = [NSNumber numberWithUnsignedShort:417U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[2]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[3] = [[MTRGroupKeyManagementClusterGroupKeyMapStruct alloc] init];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[3]).groupId = [NSNumber numberWithUnsignedShort:260U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[3]).groupKeySetID = [NSNumber numberWithUnsignedShort:418U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[3]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            groupKeyMapArgument = temp_0;
        }
        [cluster writeAttributeGroupKeyMapWithValue:groupKeyMapArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Write Group Keys Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadGroupKeys_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                              endpointID:@(0)
                                                                                   queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRReadParams alloc] init];
        params.filterByFabric = true;
        [cluster
            readAttributeGroupKeyMapWithParams:params
                                    completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                        NSLog(@"Read Group Keys Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = value;
                                            VerifyOrReturn(
                                                CheckValue("GroupKeyMap", [actualValue count], static_cast<uint32_t>(4)));
                                            VerifyOrReturn(CheckValue("GroupId",
                                                ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) actualValue[0]).groupId, 257U));
                                            VerifyOrReturn(CheckValue("GroupKeySetID",
                                                ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) actualValue[0]).groupKeySetID,
                                                417U));
                                            VerifyOrReturn(CheckValue("FabricIndex",
                                                ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) actualValue[0]).fabricIndex,
                                                1U));
                                            VerifyOrReturn(CheckValue("GroupId",
                                                ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) actualValue[1]).groupId, 258U));
                                            VerifyOrReturn(CheckValue("GroupKeySetID",
                                                ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) actualValue[1]).groupKeySetID,
                                                418U));
                                            VerifyOrReturn(CheckValue("FabricIndex",
                                                ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) actualValue[1]).fabricIndex,
                                                1U));
                                            VerifyOrReturn(CheckValue("GroupId",
                                                ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) actualValue[2]).groupId, 259U));
                                            VerifyOrReturn(CheckValue("GroupKeySetID",
                                                ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) actualValue[2]).groupKeySetID,
                                                417U));
                                            VerifyOrReturn(CheckValue("FabricIndex",
                                                ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) actualValue[2]).fabricIndex,
                                                1U));
                                            VerifyOrReturn(CheckValue("GroupId",
                                                ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) actualValue[3]).groupId, 260U));
                                            VerifyOrReturn(CheckValue("GroupKeySetID",
                                                ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) actualValue[3]).groupKeySetID,
                                                418U));
                                            VerifyOrReturn(CheckValue("FabricIndex",
                                                ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) actualValue[3]).fabricIndex,
                                                1U));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestAddGroup1_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterAddGroupParams alloc] init];
        params.groupID = [NSNumber numberWithUnsignedShort:257U];
        params.groupName = @"Group #1";
        [cluster addGroupWithParams:params
                         completion:^(MTRGroupsClusterAddGroupResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Add Group 1 Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.groupID;
                                 VerifyOrReturn(CheckValue("GroupID", actualValue, 257U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestAddGroup2_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterAddGroupParams alloc] init];
        params.groupID = [NSNumber numberWithUnsignedShort:258U];
        params.groupName = @"Group #2";
        [cluster addGroupWithParams:params
                         completion:^(MTRGroupsClusterAddGroupResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Add Group 2 Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.groupID;
                                 VerifyOrReturn(CheckValue("GroupID", actualValue, 258U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestAddGroup3_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterAddGroupParams alloc] init];
        params.groupID = [NSNumber numberWithUnsignedShort:259U];
        params.groupName = @"Group #3";
        [cluster addGroupWithParams:params
                         completion:^(MTRGroupsClusterAddGroupResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Add Group 3 Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.groupID;
                                 VerifyOrReturn(CheckValue("GroupID", actualValue, 259U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestAddGroup4_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterAddGroupParams alloc] init];
        params.groupID = [NSNumber numberWithUnsignedShort:260U];
        params.groupName = @"Group #4";
        [cluster addGroupWithParams:params
                         completion:^(MTRGroupsClusterAddGroupResponseParams * _Nullable values, NSError * _Nullable err) {
                             NSLog(@"Add Group 4 Error: %@", err);

                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                             {
                                 id actualValue = values.status;
                                 VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                             }

                             {
                                 id actualValue = values.groupID;
                                 VerifyOrReturn(CheckValue("GroupID", actualValue, 260U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadGroupTable_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                              endpointID:@(0)
                                                                                   queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRReadParams alloc] init];
        params.filterByFabric = true;
        [cluster
            readAttributeGroupTableWithParams:params
                                   completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                       NSLog(@"Read GroupTable Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = value;
                                           VerifyOrReturn(CheckValue("GroupTable", [actualValue count], static_cast<uint32_t>(4)));
                                           VerifyOrReturn(CheckValue("GroupId",
                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[0]).groupId, 257U));
                                           VerifyOrReturn(CheckValue("Endpoints",
                                               [((MTRGroupKeyManagementClusterGroupInfoMapStruct *)
                                                       actualValue[0]).endpoints count],
                                               static_cast<uint32_t>(1)));
                                           VerifyOrReturn(CheckValue("",
                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[0]).endpoints[0],
                                               1U));
                                           VerifyOrReturn(CheckValueAsString("GroupName",
                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[0]).groupName,
                                               @"Group #1"));
                                           VerifyOrReturn(CheckValue("FabricIndex",
                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[0]).fabricIndex,
                                               1U));
                                           VerifyOrReturn(CheckValue("GroupId",
                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[1]).groupId, 258U));
                                           VerifyOrReturn(CheckValue("Endpoints",
                                               [((MTRGroupKeyManagementClusterGroupInfoMapStruct *)
                                                       actualValue[1]).endpoints count],
                                               static_cast<uint32_t>(1)));
                                           VerifyOrReturn(CheckValue("",
                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[1]).endpoints[0],
                                               1U));
                                           VerifyOrReturn(CheckValueAsString("GroupName",
                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[1]).groupName,
                                               @"Group #2"));
                                           VerifyOrReturn(CheckValue("FabricIndex",
                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[1]).fabricIndex,
                                               1U));
                                           VerifyOrReturn(CheckValue("GroupId",
                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[2]).groupId, 259U));
                                           VerifyOrReturn(CheckValue("Endpoints",
                                               [((MTRGroupKeyManagementClusterGroupInfoMapStruct *)
                                                       actualValue[2]).endpoints count],
                                               static_cast<uint32_t>(1)));
                                           VerifyOrReturn(CheckValue("",
                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[2]).endpoints[0],
                                               1U));
                                           VerifyOrReturn(CheckValueAsString("GroupName",
                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[2]).groupName,
                                               @"Group #3"));
                                           VerifyOrReturn(CheckValue("FabricIndex",
                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[2]).fabricIndex,
                                               1U));
                                           VerifyOrReturn(CheckValue("GroupId",
                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[3]).groupId, 260U));
                                           VerifyOrReturn(CheckValue("Endpoints",
                                               [((MTRGroupKeyManagementClusterGroupInfoMapStruct *)
                                                       actualValue[3]).endpoints count],
                                               static_cast<uint32_t>(1)));
                                           VerifyOrReturn(CheckValue("",
                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[3]).endpoints[0],
                                               1U));
                                           VerifyOrReturn(CheckValueAsString("GroupName",
                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[3]).groupName,
                                               @"Group #4"));
                                           VerifyOrReturn(CheckValue("FabricIndex",
                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[3]).fabricIndex,
                                               1U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestKeySetRemove1_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                              endpointID:@(0)
                                                                                   queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupKeyManagementClusterKeySetRemoveParams alloc] init];
        params.groupKeySetID = [NSNumber numberWithUnsignedShort:417U];
        [cluster keySetRemoveWithParams:params
                             completion:^(NSError * _Nullable err) {
                                 NSLog(@"KeySet Remove 1 Error: %@", err);

                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                 NextTest();
                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestKeySetReadRemoved_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                              endpointID:@(0)
                                                                                   queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupKeyManagementClusterKeySetReadParams alloc] init];
        params.groupKeySetID = [NSNumber numberWithUnsignedShort:417U];
        [cluster
            keySetReadWithParams:params
                      completion:^(
                          MTRGroupKeyManagementClusterKeySetReadResponseParams * _Nullable values, NSError * _Nullable err) {
                          NSLog(@"KeySet Read (removed) Error: %@", err);

                          VerifyOrReturn(CheckValue("status",
                              err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                  : 0,
                              EMBER_ZCL_STATUS_NOT_FOUND));
                          NextTest();
                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestKeySetReadNotRemoved_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                              endpointID:@(0)
                                                                                   queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupKeyManagementClusterKeySetReadParams alloc] init];
        params.groupKeySetID = [NSNumber numberWithUnsignedShort:418U];
        [cluster
            keySetReadWithParams:params
                      completion:^(
                          MTRGroupKeyManagementClusterKeySetReadResponseParams * _Nullable values, NSError * _Nullable err) {
                          NSLog(@"KeySet Read (not removed) Error: %@", err);

                          VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                          {
                              id actualValue = values.groupKeySet;
                              VerifyOrReturn(CheckValue("GroupKeySetID",
                                  ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).groupKeySetID, 418U));
                              VerifyOrReturn(CheckValue("GroupKeySecurityPolicy",
                                  ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).groupKeySecurityPolicy, 1U));
                              VerifyOrReturn(CheckValueNull(
                                  "EpochKey0", ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).epochKey0));
                              VerifyOrReturn(CheckValueNonNull("EpochStartTime0",
                                  ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).epochStartTime0));
                              VerifyOrReturn(CheckValue("EpochStartTime0",
                                  ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).epochStartTime0, 2110000ULL));
                              VerifyOrReturn(CheckValueNull(
                                  "EpochKey1", ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).epochKey1));
                              VerifyOrReturn(CheckValueNonNull("EpochStartTime1",
                                  ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).epochStartTime1));
                              VerifyOrReturn(CheckValue("EpochStartTime1",
                                  ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).epochStartTime1, 2110001ULL));
                              VerifyOrReturn(CheckValueNull(
                                  "EpochKey2", ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).epochKey2));
                              VerifyOrReturn(CheckValueNonNull("EpochStartTime2",
                                  ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).epochStartTime2));
                              VerifyOrReturn(CheckValue("EpochStartTime2",
                                  ((MTRGroupKeyManagementClusterGroupKeySetStruct *) actualValue).epochStartTime2, 2110002ULL));
                          }

                          NextTest();
                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRemoveGroup1_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterRemoveGroupParams alloc] init];
        params.groupID = [NSNumber numberWithUnsignedShort:257U];
        [cluster removeGroupWithParams:params
                            completion:^(MTRGroupsClusterRemoveGroupResponseParams * _Nullable values, NSError * _Nullable err) {
                                NSLog(@"Remove Group 1 Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                {
                                    id actualValue = values.status;
                                    VerifyOrReturn(CheckValue("Status", actualValue, 0U));
                                }

                                {
                                    id actualValue = values.groupID;
                                    VerifyOrReturn(CheckValue("GroupID", actualValue, 257U));
                                }

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadGroupTable2_19()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                              endpointID:@(0)
                                                                                   queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRReadParams alloc] init];
        params.filterByFabric = true;
        [cluster
            readAttributeGroupTableWithParams:params
                                   completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                       NSLog(@"Read GroupTable 2 Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = value;
                                           VerifyOrReturn(CheckValue("GroupTable", [actualValue count], static_cast<uint32_t>(3)));
                                           VerifyOrReturn(CheckValue("GroupId",
                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[0]).groupId, 258U));
                                           VerifyOrReturn(CheckValue("Endpoints",
                                               [((MTRGroupKeyManagementClusterGroupInfoMapStruct *)
                                                       actualValue[0]).endpoints count],
                                               static_cast<uint32_t>(1)));
                                           VerifyOrReturn(CheckValue("",
                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[0]).endpoints[0],
                                               1U));
                                           VerifyOrReturn(CheckValueAsString("GroupName",
                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[0]).groupName,
                                               @"Group #2"));
                                           VerifyOrReturn(CheckValue("FabricIndex",
                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[0]).fabricIndex,
                                               1U));
                                           VerifyOrReturn(CheckValue("GroupId",
                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[1]).groupId, 259U));
                                           VerifyOrReturn(CheckValue("Endpoints",
                                               [((MTRGroupKeyManagementClusterGroupInfoMapStruct *)
                                                       actualValue[1]).endpoints count],
                                               static_cast<uint32_t>(1)));
                                           VerifyOrReturn(CheckValue("",
                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[1]).endpoints[0],
                                               1U));
                                           VerifyOrReturn(CheckValueAsString("GroupName",
                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[1]).groupName,
                                               @"Group #3"));
                                           VerifyOrReturn(CheckValue("FabricIndex",
                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[1]).fabricIndex,
                                               1U));
                                           VerifyOrReturn(CheckValue("GroupId",
                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[2]).groupId, 260U));
                                           VerifyOrReturn(CheckValue("Endpoints",
                                               [((MTRGroupKeyManagementClusterGroupInfoMapStruct *)
                                                       actualValue[2]).endpoints count],
                                               static_cast<uint32_t>(1)));
                                           VerifyOrReturn(CheckValue("",
                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[2]).endpoints[0],
                                               1U));
                                           VerifyOrReturn(CheckValueAsString("GroupName",
                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[2]).groupName,
                                               @"Group #4"));
                                           VerifyOrReturn(CheckValue("FabricIndex",
                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[2]).fabricIndex,
                                               1U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRemoveAll_20()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster removeAllGroupsWithCompletion:^(NSError * _Nullable err) {
            NSLog(@"Remove All Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadGroupTable3_21()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                              endpointID:@(0)
                                                                                   queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRReadParams alloc] init];
        params.filterByFabric = true;
        [cluster
            readAttributeGroupTableWithParams:params
                                   completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                       NSLog(@"Read GroupTable 3 Error: %@", err);

                                       VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                       {
                                           id actualValue = value;
                                           VerifyOrReturn(CheckValue("GroupTable", [actualValue count], static_cast<uint32_t>(0)));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestKeySetRemove2_22()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                              endpointID:@(0)
                                                                                   queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupKeyManagementClusterKeySetRemoveParams alloc] init];
        params.groupKeySetID = [NSNumber numberWithUnsignedShort:418U];
        [cluster keySetRemoveWithParams:params
                             completion:^(NSError * _Nullable err) {
                                 NSLog(@"KeySet Remove 2 Error: %@", err);

                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                 NextTest();
                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestKeySetReadAlsoRemoved_23()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                              endpointID:@(0)
                                                                                   queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupKeyManagementClusterKeySetReadParams alloc] init];
        params.groupKeySetID = [NSNumber numberWithUnsignedShort:418U];
        [cluster
            keySetReadWithParams:params
                      completion:^(
                          MTRGroupKeyManagementClusterKeySetReadResponseParams * _Nullable values, NSError * _Nullable err) {
                          NSLog(@"KeySet Read (also removed) Error: %@", err);

                          VerifyOrReturn(CheckValue("status",
                              err ? ([err.domain isEqualToString:MTRInteractionErrorDomain] ? err.code : EMBER_ZCL_STATUS_FAILURE)
                                  : 0,
                              EMBER_ZCL_STATUS_NOT_FOUND));
                          NextTest();
                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestKeySetWrite1_24()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                              endpointID:@(0)
                                                                                   queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupKeyManagementClusterKeySetWriteParams alloc] init];
        params.groupKeySet = [[MTRGroupKeyManagementClusterGroupKeySetStruct alloc] init];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).groupKeySetID =
            [NSNumber numberWithUnsignedShort:417U];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).groupKeySecurityPolicy =
            [NSNumber numberWithUnsignedChar:0U];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochKey0 =
            [[NSData alloc] initWithBytes:"\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257" length:16];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochStartTime0 =
            [NSNumber numberWithUnsignedLongLong:1110000ULL];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochKey1 =
            [[NSData alloc] initWithBytes:"\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277" length:16];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochStartTime1 =
            [NSNumber numberWithUnsignedLongLong:1110001ULL];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochKey2 =
            [[NSData alloc] initWithBytes:"\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317" length:16];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochStartTime2 =
            [NSNumber numberWithUnsignedLongLong:1110002ULL];

        [cluster keySetWriteWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"KeySet Write 1 Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestKeySetWrite2_25()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                              endpointID:@(0)
                                                                                   queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupKeyManagementClusterKeySetWriteParams alloc] init];
        params.groupKeySet = [[MTRGroupKeyManagementClusterGroupKeySetStruct alloc] init];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).groupKeySetID =
            [NSNumber numberWithUnsignedShort:418U];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).groupKeySecurityPolicy =
            [NSNumber numberWithUnsignedChar:1U];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochKey0 =
            [[NSData alloc] initWithBytes:"\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337" length:16];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochStartTime0 =
            [NSNumber numberWithUnsignedLongLong:2110000ULL];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochKey1 =
            [[NSData alloc] initWithBytes:"\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357" length:16];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochStartTime1 =
            [NSNumber numberWithUnsignedLongLong:2110001ULL];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochKey2 =
            [[NSData alloc] initWithBytes:"\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377" length:16];
        ((MTRGroupKeyManagementClusterGroupKeySetStruct *) params.groupKeySet).epochStartTime2 =
            [NSNumber numberWithUnsignedLongLong:2110002ULL];

        [cluster keySetWriteWithParams:params
                            completion:^(NSError * _Nullable err) {
                                NSLog(@"KeySet Write 2 Error: %@", err);

                                VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMapGroup1AndGroup2ToKeySet1AndGroup2ToKeySet2_26()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                              endpointID:@(0)
                                                                                   queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id groupKeyMapArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRGroupKeyManagementClusterGroupKeyMapStruct alloc] init];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[0]).groupId = [NSNumber numberWithUnsignedShort:257U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[0]).groupKeySetID = [NSNumber numberWithUnsignedShort:417U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[1] = [[MTRGroupKeyManagementClusterGroupKeyMapStruct alloc] init];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[1]).groupId = [NSNumber numberWithUnsignedShort:258U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[1]).groupKeySetID = [NSNumber numberWithUnsignedShort:418U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[1]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[2] = [[MTRGroupKeyManagementClusterGroupKeyMapStruct alloc] init];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[2]).groupId = [NSNumber numberWithUnsignedShort:258U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[2]).groupKeySetID = [NSNumber numberWithUnsignedShort:417U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[2]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            groupKeyMapArgument = temp_0;
        }
        [cluster writeAttributeGroupKeyMapWithValue:groupKeyMapArgument
                                         completion:^(NSError * _Nullable err) {
                                             NSLog(@"Map Group 1 and Group 2 to KeySet 1 and group 2 to KeySet 2 Error: %@", err);

                                             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                             NextTest();
                                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRemoveKeyset1_27()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                              endpointID:@(0)
                                                                                   queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupKeyManagementClusterKeySetRemoveParams alloc] init];
        params.groupKeySetID = [NSNumber numberWithUnsignedShort:417U];
        [cluster keySetRemoveWithParams:params
                             completion:^(NSError * _Nullable err) {
                                 NSLog(@"Remove keyset 1 Error: %@", err);

                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                 NextTest();
                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThVerifiesGroupKeyMapEntriesForKeySet1HaveBeenRemoved_28()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                              endpointID:@(0)
                                                                                   queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRReadParams alloc] init];
        params.filterByFabric = true;
        [cluster
            readAttributeGroupKeyMapWithParams:params
                                    completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                        NSLog(@"TH verifies GroupKeyMap entries for KeySet 1 have been removed Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = value;
                                            VerifyOrReturn(
                                                CheckValue("GroupKeyMap", [actualValue count], static_cast<uint32_t>(1)));
                                            VerifyOrReturn(CheckValue("GroupId",
                                                ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) actualValue[0]).groupId, 258U));
                                            VerifyOrReturn(CheckValue("GroupKeySetID",
                                                ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) actualValue[0]).groupKeySetID,
                                                418U));
                                            VerifyOrReturn(CheckValue("FabricIndex",
                                                ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) actualValue[0]).fabricIndex,
                                                1U));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRemoveKeyset2_29()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                              endpointID:@(0)
                                                                                   queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupKeyManagementClusterKeySetRemoveParams alloc] init];
        params.groupKeySetID = [NSNumber numberWithUnsignedShort:418U];
        [cluster keySetRemoveWithParams:params
                             completion:^(NSError * _Nullable err) {
                                 NSLog(@"Remove keyset 2 Error: %@", err);

                                 VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                 NextTest();
                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThVerifiesGroupKeyMapEntriesForKeySet2HaveBeenRemoved_30()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                              endpointID:@(0)
                                                                                   queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRReadParams alloc] init];
        params.filterByFabric = true;
        [cluster
            readAttributeGroupKeyMapWithParams:params
                                    completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                        NSLog(@"TH verifies GroupKeyMap entries for KeySet 2 have been removed Error: %@", err);

                                        VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

                                        {
                                            id actualValue = value;
                                            VerifyOrReturn(
                                                CheckValue("GroupKeyMap", [actualValue count], static_cast<uint32_t>(0)));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_G_1_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_G_1_1()
        : TestCommandBridge("Test_TC_G_1_1")
        , mTestIndex(0)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint);
        AddArgument("timeout", 0, UINT16_MAX, &mTimeout);
    }
    // NOLINTEND(clang-analyzer-nullability.NullPassedToNonnull)

    ~Test_TC_G_1_1() {}

    // Allow yaml to access the current commissioner node id.
    // Default to 0 (undefined node id) so we know if this isn't
    // set correctly.
    // Reset on every step in case it changed.
    chip::NodeId commissionerNodeId = mCommissionerNodeId.ValueOr(0);

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);

        if (0 == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Start: Test_TC_G_1_1\n");
        }

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_G_1_1\n");
            SetCommandExitStatus(CHIP_NO_ERROR);
            return;
        }

        Wait();

        // Ensure we increment mTestIndex before we start running the relevant
        // command.  That way if we lose the timeslice after we send the message
        // but before our function call returns, we won't end up with an
        // incorrect mTestIndex value observed when we get the response.
        switch (mTestIndex++) {
        case 0:
            ChipLogProgress(chipTool, " ***** Test Step 0 : Wait for the commissioned device to be retrieved\n");
            err = TestWaitForTheCommissionedDeviceToBeRetrieved_0();
            break;
        case 1:
            ChipLogProgress(chipTool, " ***** Test Step 1 : TH reads the ClusterRevision from DUT\n");
            err = TestThReadsTheClusterRevisionFromDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads the FeatureMap from DUT\n");
            if (ShouldSkip(" !G.S.F00 ")) {
                NextTest();
                return;
            }
            err = TestThReadsTheFeatureMapFromDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Given G.S.F00 ensure featuremap has the correct bit set\n");
            if (ShouldSkip("G.S.F00")) {
                NextTest();
                return;
            }
            err = TestGivenGsf00EnsureFeaturemapHasTheCorrectBitSet_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH reads AttributeList from DUT\n");
            err = TestThReadsAttributeListFromDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH reads AcceptedCommandList from DUT\n");
            err = TestThReadsAcceptedCommandListFromDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : TH reads GeneratedCommandList from DUT\n");
            err = TestThReadsGeneratedCommandListFromDut_6();
            break;
        }

        if (CHIP_NO_ERROR != err) {
            ChipLogError(chipTool, " ***** Test Failure: %s\n", chip::ErrorStr(err));
            SetCommandExitStatus(err);
        }
    }

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

        // Go on to the next test.
        ContinueOnChipMainThread(CHIP_NO_ERROR);
    }

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

private:
    std::atomic_uint16_t mTestIndex;
    const uint16_t mTestCount = 7;

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

    CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
    {

        chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
        value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
        return WaitForCommissionee("alpha", value);
    }

    CHIP_ERROR TestThReadsTheClusterRevisionFromDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the ClusterRevision from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ClusterRevision", actualValue, 4U));
            }

            VerifyOrReturn(CheckConstraintType("clusterRevision", "int16u", "int16u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheFeatureMapFromDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads the FeatureMap from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("FeatureMap", actualValue, 0UL));
            }

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestGivenGsf00EnsureFeaturemapHasTheCorrectBitSet_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Given G.S.F00 ensure featuremap has the correct bit set Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAttributeListFromDut_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AttributeList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("attributeList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65528UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65529UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65531UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65532UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAcceptedCommandListFromDut_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AcceptedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("acceptedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 3UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 4UL));
            VerifyOrReturn(CheckConstraintContains("acceptedCommandList", value, 5UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsGeneratedCommandListFromDut_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        commissionerNodeId = mCommissionerNodeId.ValueOr(0);
        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads GeneratedCommandList from DUT Error: %@", err);

            VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));

            VerifyOrReturn(CheckConstraintType("generatedCommandList", "list", "list"));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 0UL));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 2UL));
            VerifyOrReturn(CheckConstraintContains("generatedCommandList", value, 3UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

#endif // CONFIG_ENABLE_YAML_TESTS

void registerCommandsTests(Commands & commands)
{
    const char * clusterName = "Tests";

    commands_list clusterCommands = {
#if CONFIG_ENABLE_YAML_TESTS
        make_unique<TestList>(),
        make_unique<ManualTestList>(),
        make_unique<TestAccessControlCluster>(),
        make_unique<Test_TC_ACL_1_1>(),
        make_unique<Test_TC_ACL_2_1>(),
        make_unique<Test_TC_ACL_2_2>(),
        make_unique<Test_TC_ACL_2_3>(),
        make_unique<Test_TC_BOOL_1_1>(),
        make_unique<Test_TC_BOOL_2_1>(),
        make_unique<Test_TC_BRBINFO_1_1>(),
        make_unique<Test_TC_ACT_1_1>(),
        make_unique<Test_TC_BIND_1_1>(),
        make_unique<Test_TC_CC_1_1>(),
        make_unique<Test_TC_CC_2_1>(),
        make_unique<Test_TC_CC_3_2>(),
        make_unique<Test_TC_CC_3_3>(),
        make_unique<Test_TC_CC_4_1>(),
        make_unique<Test_TC_CC_4_2>(),
        make_unique<Test_TC_CC_4_3>(),
        make_unique<Test_TC_CC_4_4>(),
        make_unique<Test_TC_CC_5_1>(),
        make_unique<Test_TC_CC_5_2>(),
        make_unique<Test_TC_CC_5_3>(),
        make_unique<Test_TC_CC_6_1>(),
        make_unique<Test_TC_CC_7_3>(),
        make_unique<Test_TC_CC_7_4>(),
        make_unique<Test_TC_OPCREDS_1_2>(),
        make_unique<Test_TC_BINFO_1_1>(),
        make_unique<Test_TC_CNET_1_3>(),
        make_unique<Test_TC_DESC_1_1>(),
        make_unique<Test_TC_DLOG_1_1>(),
        make_unique<Test_TC_DGETH_1_1>(),
        make_unique<Test_TC_DGETH_2_1>(),
        make_unique<Test_TC_DGETH_2_2>(),
        make_unique<Test_TC_FLW_1_1>(),
        make_unique<Test_TC_FLW_2_1>(),
        make_unique<Test_TC_FLABEL_1_1>(),
        make_unique<Test_TC_CGEN_1_1>(),
        make_unique<Test_TC_CGEN_2_1>(),
        make_unique<Test_TC_DGGEN_1_1>(),
        make_unique<Test_TC_DGGEN_2_1>(),
        make_unique<Test_TC_I_1_1>(),
        make_unique<Test_TC_I_2_1>(),
        make_unique<Test_TC_I_2_2>(),
        make_unique<Test_TC_I_2_3>(),
        make_unique<Test_TC_ILL_1_1>(),
        make_unique<Test_TC_ILL_2_1>(),
        make_unique<Test_TC_ILL_2_2>(),
        make_unique<Test_TC_LVL_1_1>(),
        make_unique<Test_TC_LVL_2_1>(),
        make_unique<Test_TC_LVL_2_2>(),
        make_unique<Test_TC_LVL_3_1>(),
        make_unique<Test_TC_LVL_4_1>(),
        make_unique<Test_TC_LVL_5_1>(),
        make_unique<Test_TC_LVL_6_1>(),
        make_unique<Test_TC_LCFG_1_1>(),
        make_unique<Test_TC_LUNIT_1_2>(),
        make_unique<Test_TC_LUNIT_3_1>(),
        make_unique<Test_TC_LTIME_1_2>(),
        make_unique<Test_TC_LOWPOWER_1_1>(),
        make_unique<Test_TC_KEYPADINPUT_1_2>(),
        make_unique<Test_TC_APPLAUNCHER_1_3>(),
        make_unique<Test_TC_MEDIAINPUT_1_4>(),
        make_unique<Test_TC_WAKEONLAN_1_5>(),
        make_unique<Test_TC_CHANNEL_1_6>(),
        make_unique<Test_TC_MEDIAPLAYBACK_1_7>(),
        make_unique<Test_TC_AUDIOOUTPUT_1_8>(),
        make_unique<Test_TC_TGTNAV_1_9>(),
        make_unique<Test_TC_TGTNAV_8_2>(),
        make_unique<Test_TC_APBSC_1_10>(),
        make_unique<Test_TC_CONTENTLAUNCHER_1_11>(),
        make_unique<Test_TC_ALOGIN_1_12>(),
        make_unique<Test_TC_ALOGIN_12_1>(),
        make_unique<Test_TC_LOWPOWER_2_1>(),
        make_unique<Test_TC_KEYPADINPUT_3_2>(),
        make_unique<Test_TC_KEYPADINPUT_3_3>(),
        make_unique<Test_TC_APPLAUNCHER_3_5>(),
        make_unique<Test_TC_APPLAUNCHER_3_6>(),
        make_unique<Test_TC_MEDIAINPUT_3_10>(),
        make_unique<Test_TC_MEDIAINPUT_3_11>(),
        make_unique<Test_TC_MEDIAINPUT_3_12>(),
        make_unique<Test_TC_MEDIAINPUT_3_13>(),
        make_unique<Test_TC_WAKEONLAN_4_1>(),
        make_unique<Test_TC_CHANNEL_5_1>(),
        make_unique<Test_TC_CHANNEL_5_2>(),
        make_unique<Test_TC_CHANNEL_5_3>(),
        make_unique<Test_TC_MEDIAPLAYBACK_6_1>(),
        make_unique<Test_TC_MEDIAPLAYBACK_6_2>(),
        make_unique<Test_TC_MEDIAPLAYBACK_6_3>(),
        make_unique<Test_TC_MEDIAPLAYBACK_6_4>(),
        make_unique<Test_TC_AUDIOOUTPUT_7_1>(),
        make_unique<Test_TC_AUDIOOUTPUT_7_2>(),
        make_unique<Test_TC_TGTNAV_8_1>(),
        make_unique<Test_TC_APBSC_9_1>(),
        make_unique<Test_TC_CONTENTLAUNCHER_10_1>(),
        make_unique<Test_TC_MOD_1_1>(),
        make_unique<OTA_SuccessfulTransfer>(),
        make_unique<Test_TC_OCC_1_1>(),
        make_unique<Test_TC_OCC_2_1>(),
        make_unique<Test_TC_OCC_2_3>(),
        make_unique<Test_TC_OO_1_1>(),
        make_unique<Test_TC_OO_2_1>(),
        make_unique<Test_TC_OO_2_2>(),
        make_unique<Test_TC_OO_2_4>(),
        make_unique<Test_TC_PS_1_1>(),
        make_unique<Test_TC_PS_2_1>(),
        make_unique<Test_TC_PRS_1_1>(),
        make_unique<Test_TC_PRS_2_1>(),
        make_unique<Test_TC_PRS_2_2>(),
        make_unique<Test_TC_PCC_1_1>(),
        make_unique<Test_TC_PCC_2_1>(),
        make_unique<Test_TC_PCC_2_2>(),
        make_unique<Test_TC_PCC_2_3>(),
        make_unique<Test_TC_PCC_2_4>(),
        make_unique<Test_TC_PSCFG_1_1>(),
        make_unique<Test_TC_PSCFG_2_1>(),
        make_unique<Test_TC_RH_1_1>(),
        make_unique<Test_TC_RH_2_1>(),
        make_unique<Test_TC_SWTCH_1_1>(),
        make_unique<Test_TC_TMP_1_1>(),
        make_unique<Test_TC_TMP_2_1>(),
        make_unique<Test_TC_TSTAT_1_1>(),
        make_unique<Test_TC_TSUIC_1_1>(),
        make_unique<Test_TC_TSUIC_2_1>(),
        make_unique<Test_TC_TSUIC_2_2>(),
        make_unique<Test_TC_DGTHREAD_1_1>(),
        make_unique<Test_TC_ULABEL_1_1>(),
        make_unique<Test_TC_ULABEL_2_1>(),
        make_unique<Test_TC_ULABEL_2_2>(),
        make_unique<Test_TC_ULABEL_2_3>(),
        make_unique<Test_TC_ULABEL_2_4>(),
        make_unique<Test_TC_DGWIFI_1_1>(),
        make_unique<Test_TC_DGWIFI_2_1>(),
        make_unique<Test_TC_DGWIFI_2_3>(),
        make_unique<Test_TC_WNCV_1_1>(),
        make_unique<Test_TC_WNCV_2_1>(),
        make_unique<Test_TC_WNCV_2_2>(),
        make_unique<Test_TC_WNCV_2_3>(),
        make_unique<Test_TC_WNCV_2_4>(),
        make_unique<Test_TC_WNCV_2_5>(),
        make_unique<Test_TC_WNCV_3_1>(),
        make_unique<Test_TC_WNCV_3_2>(),
        make_unique<Test_TC_WNCV_3_3>(),
        make_unique<Test_TC_WNCV_3_4>(),
        make_unique<Test_TC_WNCV_3_5>(),
        make_unique<Test_TC_WNCV_4_1>(),
        make_unique<Test_TC_WNCV_4_2>(),
        make_unique<Test_TC_WNCV_4_3>(),
        make_unique<Test_TC_WNCV_4_4>(),
        make_unique<Test_TC_WNCV_4_5>(),
        make_unique<TV_TargetNavigatorCluster>(),
        make_unique<TV_AudioOutputCluster>(),
        make_unique<TV_ApplicationLauncherCluster>(),
        make_unique<TV_KeypadInputCluster>(),
        make_unique<TV_AccountLoginCluster>(),
        make_unique<TV_WakeOnLanCluster>(),
        make_unique<TV_ApplicationBasicCluster>(),
        make_unique<TV_MediaPlaybackCluster>(),
        make_unique<TV_ChannelCluster>(),
        make_unique<TV_LowPowerCluster>(),
        make_unique<TV_ContentLauncherCluster>(),
        make_unique<TV_MediaInputCluster>(),
        make_unique<TestCASERecovery>(),
        make_unique<TestCluster>(),
        make_unique<TestConstraints>(),
        make_unique<TestDelayCommands>(),
        make_unique<TestLogCommands>(),
        make_unique<TestSaveAs>(),
        make_unique<TestConfigVariables>(),
        make_unique<TestDescriptorCluster>(),
        make_unique<TestBasicInformation>(),
        make_unique<TestFabricRemovalWhileSubscribed>(),
        make_unique<TestGeneralCommissioning>(),
        make_unique<TestIdentifyCluster>(),
        make_unique<TestOperationalCredentialsCluster>(),
        make_unique<TestModeSelectCluster>(),
        make_unique<TestSelfFabricRemoval>(),
        make_unique<TestSystemCommands>(),
        make_unique<TestBinding>(),
        make_unique<TestUserLabelCluster>(),
        make_unique<TestUserLabelClusterConstraints>(),
        make_unique<TestArmFailSafe>(),
        make_unique<TestFanControl>(),
        make_unique<TestAccessControlConstraints>(),
        make_unique<TestLevelControlWithOnOffDependency>(),
        make_unique<TestCommissioningWindow>(),
        make_unique<TestCommissionerNodeId>(),
        make_unique<TestMultiAdmin>(),
        make_unique<Test_TC_DGSW_1_1>(),
        make_unique<TestSubscribe_OnOff>(),
        make_unique<TestSubscribe_AdministratorCommissioning>(),
        make_unique<DL_UsersAndCredentials>(),
        make_unique<DL_LockUnlock>(),
        make_unique<DL_Schedules>(),
        make_unique<Test_TC_DRLK_1_1>(),
        make_unique<Test_TC_DRLK_2_2>(),
        make_unique<Test_TC_DRLK_2_3>(),
        make_unique<Test_TC_DRLK_2_4>(),
        make_unique<Test_TC_DRLK_2_5>(),
        make_unique<Test_TC_DRLK_2_6>(),
        make_unique<Test_TC_DRLK_2_7>(),
        make_unique<Test_TC_DRLK_2_9>(),
        make_unique<TestGroupsCluster>(),
        make_unique<TestGroupKeyManagementCluster>(),
        make_unique<Test_TC_G_1_1>(),
#endif // CONFIG_ENABLE_YAML_TESTS
    };

    commands.Register(clusterName, clusterCommands);
}
