/*
 *
 *    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_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_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("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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            ((MTRAccessControlClusterAccessControlEntry *) 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;

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

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:1U];
            ((MTRAccessControlClusterAccessControlEntry *) 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];
                ((MTRAccessControlClusterAccessControlEntry *) 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;

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

            temp_0[2] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[2]).privilege = [NSNumber numberWithUnsignedChar:3U];
            ((MTRAccessControlClusterAccessControlEntry *) 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];
                ((MTRAccessControlClusterAccessControlEntry *) 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;

                ((MTRAccessControlClusterAccessControlEntry *) temp_0[2]).targets = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[2]).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");
        __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>(3)));
                                         VerifyOrReturn(CheckValue("Privilege",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).privilege, 5U));
                                         VerifyOrReturn(CheckValue("AuthMode",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).authMode, 2U));
                                         VerifyOrReturn(CheckValueNull(
                                             "Subjects", ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).subjects));
                                         VerifyOrReturn(CheckValueNonNull(
                                             "Targets", ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).targets));
                                         VerifyOrReturn(CheckValue("Targets",
                                             [((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).targets count],
                                             static_cast<uint32_t>(3)));
                                         VerifyOrReturn(CheckValueNull("Cluster",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[0])
                                                     .targets[0])
                                                 .cluster));
                                         VerifyOrReturn(CheckValueNonNull("Endpoint",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[0])
                                                     .targets[0])
                                                 .endpoint));
                                         VerifyOrReturn(CheckValue("Endpoint",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[0])
                                                     .targets[0])
                                                 .endpoint,
                                             0U));
                                         VerifyOrReturn(CheckValueNull("DeviceType",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[0])
                                                     .targets[0])
                                                 .deviceType));
                                         VerifyOrReturn(CheckValueNonNull("Cluster",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[0])
                                                     .targets[1])
                                                 .cluster));
                                         VerifyOrReturn(CheckValue("Cluster",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[0])
                                                     .targets[1])
                                                 .cluster,
                                             1UL));
                                         VerifyOrReturn(CheckValueNull("Endpoint",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[0])
                                                     .targets[1])
                                                 .endpoint));
                                         VerifyOrReturn(CheckValueNull("DeviceType",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[0])
                                                     .targets[1])
                                                 .deviceType));
                                         VerifyOrReturn(CheckValueNonNull("Cluster",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[0])
                                                     .targets[2])
                                                 .cluster));
                                         VerifyOrReturn(CheckValue("Cluster",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[0])
                                                     .targets[2])
                                                 .cluster,
                                             2UL));
                                         VerifyOrReturn(CheckValueNonNull("Endpoint",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[0])
                                                     .targets[2])
                                                 .endpoint));
                                         VerifyOrReturn(CheckValue("Endpoint",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[0])
                                                     .targets[2])
                                                 .endpoint,
                                             3U));
                                         VerifyOrReturn(CheckValueNull("DeviceType",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[0])
                                                     .targets[2])
                                                 .deviceType));
                                         VerifyOrReturn(CheckValue("FabricIndex",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).fabricIndex, 1U));
                                         VerifyOrReturn(CheckValue("Privilege",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[1]).privilege, 1U));
                                         VerifyOrReturn(CheckValue("AuthMode",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[1]).authMode, 2U));
                                         VerifyOrReturn(CheckValueNonNull(
                                             "Subjects", ((MTRAccessControlClusterAccessControlEntry *) actualValue[1]).subjects));
                                         VerifyOrReturn(CheckValue("Subjects",
                                             [((MTRAccessControlClusterAccessControlEntry *) actualValue[1]).subjects count],
                                             static_cast<uint32_t>(4)));
                                         VerifyOrReturn(CheckValue(
                                             "", ((MTRAccessControlClusterAccessControlEntry *) actualValue[1]).subjects[0], 4ULL));
                                         VerifyOrReturn(CheckValue(
                                             "", ((MTRAccessControlClusterAccessControlEntry *) actualValue[1]).subjects[1], 5ULL));
                                         VerifyOrReturn(CheckValue(
                                             "", ((MTRAccessControlClusterAccessControlEntry *) actualValue[1]).subjects[2], 6ULL));
                                         VerifyOrReturn(CheckValue(
                                             "", ((MTRAccessControlClusterAccessControlEntry *) actualValue[1]).subjects[3], 7ULL));
                                         VerifyOrReturn(CheckValueNonNull(
                                             "Targets", ((MTRAccessControlClusterAccessControlEntry *) actualValue[1]).targets));
                                         VerifyOrReturn(CheckValue("Targets",
                                             [((MTRAccessControlClusterAccessControlEntry *) actualValue[1]).targets count],
                                             static_cast<uint32_t>(3)));
                                         VerifyOrReturn(CheckValueNull("Cluster",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[1])
                                                     .targets[0])
                                                 .cluster));
                                         VerifyOrReturn(CheckValueNonNull("Endpoint",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[1])
                                                     .targets[0])
                                                 .endpoint));
                                         VerifyOrReturn(CheckValue("Endpoint",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[1])
                                                     .targets[0])
                                                 .endpoint,
                                             8U));
                                         VerifyOrReturn(CheckValueNull("DeviceType",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[1])
                                                     .targets[0])
                                                 .deviceType));
                                         VerifyOrReturn(CheckValueNonNull("Cluster",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[1])
                                                     .targets[1])
                                                 .cluster));
                                         VerifyOrReturn(CheckValue("Cluster",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[1])
                                                     .targets[1])
                                                 .cluster,
                                             9UL));
                                         VerifyOrReturn(CheckValueNull("Endpoint",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[1])
                                                     .targets[1])
                                                 .endpoint));
                                         VerifyOrReturn(CheckValueNull("DeviceType",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[1])
                                                     .targets[1])
                                                 .deviceType));
                                         VerifyOrReturn(CheckValueNonNull("Cluster",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[1])
                                                     .targets[2])
                                                 .cluster));
                                         VerifyOrReturn(CheckValue("Cluster",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[1])
                                                     .targets[2])
                                                 .cluster,
                                             10UL));
                                         VerifyOrReturn(CheckValueNonNull("Endpoint",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[1])
                                                     .targets[2])
                                                 .endpoint));
                                         VerifyOrReturn(CheckValue("Endpoint",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[1])
                                                     .targets[2])
                                                 .endpoint,
                                             11U));
                                         VerifyOrReturn(CheckValueNull("DeviceType",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[1])
                                                     .targets[2])
                                                 .deviceType));
                                         VerifyOrReturn(CheckValue("FabricIndex",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[1]).fabricIndex, 1U));
                                         VerifyOrReturn(CheckValue("Privilege",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[2]).privilege, 3U));
                                         VerifyOrReturn(CheckValue("AuthMode",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[2]).authMode, 3U));
                                         VerifyOrReturn(CheckValueNonNull(
                                             "Subjects", ((MTRAccessControlClusterAccessControlEntry *) actualValue[2]).subjects));
                                         VerifyOrReturn(CheckValue("Subjects",
                                             [((MTRAccessControlClusterAccessControlEntry *) actualValue[2]).subjects count],
                                             static_cast<uint32_t>(4)));
                                         VerifyOrReturn(CheckValue("",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[2]).subjects[0], 12ULL));
                                         VerifyOrReturn(CheckValue("",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[2]).subjects[1], 13ULL));
                                         VerifyOrReturn(CheckValue("",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[2]).subjects[2], 14ULL));
                                         VerifyOrReturn(CheckValue("",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[2]).subjects[3], 15ULL));
                                         VerifyOrReturn(CheckValueNonNull(
                                             "Targets", ((MTRAccessControlClusterAccessControlEntry *) actualValue[2]).targets));
                                         VerifyOrReturn(CheckValue("Targets",
                                             [((MTRAccessControlClusterAccessControlEntry *) actualValue[2]).targets count],
                                             static_cast<uint32_t>(3)));
                                         VerifyOrReturn(CheckValueNull("Cluster",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[2])
                                                     .targets[0])
                                                 .cluster));
                                         VerifyOrReturn(CheckValueNonNull("Endpoint",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[2])
                                                     .targets[0])
                                                 .endpoint));
                                         VerifyOrReturn(CheckValue("Endpoint",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[2])
                                                     .targets[0])
                                                 .endpoint,
                                             16U));
                                         VerifyOrReturn(CheckValueNull("DeviceType",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[2])
                                                     .targets[0])
                                                 .deviceType));
                                         VerifyOrReturn(CheckValueNonNull("Cluster",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[2])
                                                     .targets[1])
                                                 .cluster));
                                         VerifyOrReturn(CheckValue("Cluster",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[2])
                                                     .targets[1])
                                                 .cluster,
                                             17UL));
                                         VerifyOrReturn(CheckValueNull("Endpoint",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[2])
                                                     .targets[1])
                                                 .endpoint));
                                         VerifyOrReturn(CheckValueNull("DeviceType",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[2])
                                                     .targets[1])
                                                 .deviceType));
                                         VerifyOrReturn(CheckValueNonNull("Cluster",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[2])
                                                     .targets[2])
                                                 .cluster));
                                         VerifyOrReturn(CheckValue("Cluster",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[2])
                                                     .targets[2])
                                                 .cluster,
                                             18UL));
                                         VerifyOrReturn(CheckValueNonNull("Endpoint",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[2])
                                                     .targets[2])
                                                 .endpoint));
                                         VerifyOrReturn(CheckValue("Endpoint",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[2])
                                                     .targets[2])
                                                 .endpoint,
                                             19U));
                                         VerifyOrReturn(CheckValueNull("DeviceType",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[2])
                                                     .targets[2])
                                                 .deviceType));
                                         VerifyOrReturn(CheckValue("FabricIndex",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[2]).fabricIndex, 1U));
                                     }

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteEntriesEmptyLists_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).subjects = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:0U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:1U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).subjects = temp_3;
            }
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).targets = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) 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");
        __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",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).privilege, 5U));
                                         VerifyOrReturn(CheckValue("AuthMode",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).authMode, 2U));
                                         VerifyOrReturn(CheckValueNull(
                                             "Subjects", ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).subjects));
                                         VerifyOrReturn(CheckValueNull(
                                             "Targets", ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).targets));
                                         VerifyOrReturn(CheckValue("FabricIndex",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).fabricIndex, 1U));
                                         VerifyOrReturn(CheckValue("Privilege",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[1]).privilege, 1U));
                                         VerifyOrReturn(CheckValue("AuthMode",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[1]).authMode, 2U));
                                         VerifyOrReturn(CheckValueNull(
                                             "Subjects", ((MTRAccessControlClusterAccessControlEntry *) actualValue[1]).subjects));
                                         VerifyOrReturn(CheckValueNull(
                                             "Targets", ((MTRAccessControlClusterAccessControlEntry *) actualValue[1]).targets));
                                         VerifyOrReturn(CheckValue("FabricIndex",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[1]).fabricIndex, 1U));
                                     }

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteEntryInvalidPrivilege_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).subjects = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:0U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:3U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).subjects = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) 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");
        __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",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).privilege, 5U));
                                         VerifyOrReturn(CheckValue("AuthMode",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).authMode, 2U));
                                         VerifyOrReturn(CheckValueNull(
                                             "Subjects", ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).subjects));
                                         VerifyOrReturn(CheckValueNull(
                                             "Targets", ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).targets));
                                         VerifyOrReturn(CheckValue("FabricIndex",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).fabricIndex, 1U));
                                     }

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteEntryInvalidAuthMode_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).subjects = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:0U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:1U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:1U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).subjects = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) 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");
        __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",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).privilege, 5U));
                                         VerifyOrReturn(CheckValue("AuthMode",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).authMode, 2U));
                                         VerifyOrReturn(CheckValueNull(
                                             "Subjects", ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).subjects));
                                         VerifyOrReturn(CheckValueNull(
                                             "Targets", ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).targets));
                                         VerifyOrReturn(CheckValue("FabricIndex",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).fabricIndex, 1U));
                                     }

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteEntryInvalidSubject_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).subjects = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:0U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:1U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:0ULL];
                ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) 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");
        __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",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).privilege, 5U));
                                         VerifyOrReturn(CheckValue("AuthMode",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).authMode, 2U));
                                         VerifyOrReturn(CheckValueNull(
                                             "Subjects", ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).subjects));
                                         VerifyOrReturn(CheckValueNull(
                                             "Targets", ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).targets));
                                         VerifyOrReturn(CheckValue("FabricIndex",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).fabricIndex, 1U));
                                     }

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteEntryInvalidTarget_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).subjects = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:0U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:1U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:2U];
            ((MTRAccessControlClusterAccessControlEntry *) 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;

                ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).targets = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) 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");
        __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",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).privilege, 5U));
                                         VerifyOrReturn(CheckValue("AuthMode",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).authMode, 2U));
                                         VerifyOrReturn(CheckValueNull(
                                             "Subjects", ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).subjects));
                                         VerifyOrReturn(CheckValueNull(
                                             "Targets", ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).targets));
                                         VerifyOrReturn(CheckValue("FabricIndex",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).fabricIndex, 1U));
                                     }

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteEntryTooManySubjects_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).subjects = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:0U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:1U];
            ((MTRAccessControlClusterAccessControlEntry *) 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];
                ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) 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");
        __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",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).privilege, 5U));
                                         VerifyOrReturn(CheckValue("AuthMode",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).authMode, 2U));
                                         VerifyOrReturn(CheckValueNull(
                                             "Subjects", ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).subjects));
                                         VerifyOrReturn(CheckValueNull(
                                             "Targets", ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).targets));
                                         VerifyOrReturn(CheckValue("FabricIndex",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).fabricIndex, 1U));
                                     }

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteEntryTooManyTargets_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).subjects = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:0U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:1U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:2U];
            ((MTRAccessControlClusterAccessControlEntry *) 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;

                ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).targets = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) 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");
        __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",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).privilege, 5U));
                                         VerifyOrReturn(CheckValue("AuthMode",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).authMode, 2U));
                                         VerifyOrReturn(CheckValueNull(
                                             "Subjects", ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).subjects));
                                         VerifyOrReturn(CheckValueNull(
                                             "Targets", ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).targets));
                                         VerifyOrReturn(CheckValue("FabricIndex",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).fabricIndex, 1U));
                                     }

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteTooManyEntries_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            ((MTRAccessControlClusterAccessControlEntry *) 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;

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

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:1U];
            ((MTRAccessControlClusterAccessControlEntry *) 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];
                ((MTRAccessControlClusterAccessControlEntry *) 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;

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

            temp_0[2] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[2]).privilege = [NSNumber numberWithUnsignedChar:3U];
            ((MTRAccessControlClusterAccessControlEntry *) 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];
                ((MTRAccessControlClusterAccessControlEntry *) 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;

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

            temp_0[3] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[3]).privilege = [NSNumber numberWithUnsignedChar:1U];
            ((MTRAccessControlClusterAccessControlEntry *) 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];
                ((MTRAccessControlClusterAccessControlEntry *) 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;

                ((MTRAccessControlClusterAccessControlEntry *) temp_0[3]).targets = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[3]).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");
        __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>(3)));
                                         VerifyOrReturn(CheckValue("Privilege",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).privilege, 5U));
                                         VerifyOrReturn(CheckValue("AuthMode",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).authMode, 2U));
                                         VerifyOrReturn(CheckValueNull(
                                             "Subjects", ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).subjects));
                                         VerifyOrReturn(CheckValueNonNull(
                                             "Targets", ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).targets));
                                         VerifyOrReturn(CheckValue("Targets",
                                             [((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).targets count],
                                             static_cast<uint32_t>(3)));
                                         VerifyOrReturn(CheckValueNull("Cluster",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[0])
                                                     .targets[0])
                                                 .cluster));
                                         VerifyOrReturn(CheckValueNonNull("Endpoint",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[0])
                                                     .targets[0])
                                                 .endpoint));
                                         VerifyOrReturn(CheckValue("Endpoint",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[0])
                                                     .targets[0])
                                                 .endpoint,
                                             0U));
                                         VerifyOrReturn(CheckValueNull("DeviceType",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[0])
                                                     .targets[0])
                                                 .deviceType));
                                         VerifyOrReturn(CheckValueNonNull("Cluster",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[0])
                                                     .targets[1])
                                                 .cluster));
                                         VerifyOrReturn(CheckValue("Cluster",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[0])
                                                     .targets[1])
                                                 .cluster,
                                             1UL));
                                         VerifyOrReturn(CheckValueNull("Endpoint",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[0])
                                                     .targets[1])
                                                 .endpoint));
                                         VerifyOrReturn(CheckValueNull("DeviceType",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[0])
                                                     .targets[1])
                                                 .deviceType));
                                         VerifyOrReturn(CheckValueNonNull("Cluster",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[0])
                                                     .targets[2])
                                                 .cluster));
                                         VerifyOrReturn(CheckValue("Cluster",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[0])
                                                     .targets[2])
                                                 .cluster,
                                             2UL));
                                         VerifyOrReturn(CheckValueNonNull("Endpoint",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[0])
                                                     .targets[2])
                                                 .endpoint));
                                         VerifyOrReturn(CheckValue("Endpoint",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[0])
                                                     .targets[2])
                                                 .endpoint,
                                             3U));
                                         VerifyOrReturn(CheckValueNull("DeviceType",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[0])
                                                     .targets[2])
                                                 .deviceType));
                                         VerifyOrReturn(CheckValue("FabricIndex",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).fabricIndex, 1U));
                                         VerifyOrReturn(CheckValue("Privilege",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[1]).privilege, 1U));
                                         VerifyOrReturn(CheckValue("AuthMode",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[1]).authMode, 2U));
                                         VerifyOrReturn(CheckValueNonNull(
                                             "Subjects", ((MTRAccessControlClusterAccessControlEntry *) actualValue[1]).subjects));
                                         VerifyOrReturn(CheckValue("Subjects",
                                             [((MTRAccessControlClusterAccessControlEntry *) actualValue[1]).subjects count],
                                             static_cast<uint32_t>(4)));
                                         VerifyOrReturn(CheckValue(
                                             "", ((MTRAccessControlClusterAccessControlEntry *) actualValue[1]).subjects[0], 4ULL));
                                         VerifyOrReturn(CheckValue(
                                             "", ((MTRAccessControlClusterAccessControlEntry *) actualValue[1]).subjects[1], 5ULL));
                                         VerifyOrReturn(CheckValue(
                                             "", ((MTRAccessControlClusterAccessControlEntry *) actualValue[1]).subjects[2], 6ULL));
                                         VerifyOrReturn(CheckValue(
                                             "", ((MTRAccessControlClusterAccessControlEntry *) actualValue[1]).subjects[3], 7ULL));
                                         VerifyOrReturn(CheckValueNonNull(
                                             "Targets", ((MTRAccessControlClusterAccessControlEntry *) actualValue[1]).targets));
                                         VerifyOrReturn(CheckValue("Targets",
                                             [((MTRAccessControlClusterAccessControlEntry *) actualValue[1]).targets count],
                                             static_cast<uint32_t>(3)));
                                         VerifyOrReturn(CheckValueNull("Cluster",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[1])
                                                     .targets[0])
                                                 .cluster));
                                         VerifyOrReturn(CheckValueNonNull("Endpoint",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[1])
                                                     .targets[0])
                                                 .endpoint));
                                         VerifyOrReturn(CheckValue("Endpoint",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[1])
                                                     .targets[0])
                                                 .endpoint,
                                             8U));
                                         VerifyOrReturn(CheckValueNull("DeviceType",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[1])
                                                     .targets[0])
                                                 .deviceType));
                                         VerifyOrReturn(CheckValueNonNull("Cluster",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[1])
                                                     .targets[1])
                                                 .cluster));
                                         VerifyOrReturn(CheckValue("Cluster",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[1])
                                                     .targets[1])
                                                 .cluster,
                                             9UL));
                                         VerifyOrReturn(CheckValueNull("Endpoint",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[1])
                                                     .targets[1])
                                                 .endpoint));
                                         VerifyOrReturn(CheckValueNull("DeviceType",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[1])
                                                     .targets[1])
                                                 .deviceType));
                                         VerifyOrReturn(CheckValueNonNull("Cluster",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[1])
                                                     .targets[2])
                                                 .cluster));
                                         VerifyOrReturn(CheckValue("Cluster",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[1])
                                                     .targets[2])
                                                 .cluster,
                                             10UL));
                                         VerifyOrReturn(CheckValueNonNull("Endpoint",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[1])
                                                     .targets[2])
                                                 .endpoint));
                                         VerifyOrReturn(CheckValue("Endpoint",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[1])
                                                     .targets[2])
                                                 .endpoint,
                                             11U));
                                         VerifyOrReturn(CheckValueNull("DeviceType",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[1])
                                                     .targets[2])
                                                 .deviceType));
                                         VerifyOrReturn(CheckValue("FabricIndex",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[1]).fabricIndex, 1U));
                                         VerifyOrReturn(CheckValue("Privilege",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[2]).privilege, 3U));
                                         VerifyOrReturn(CheckValue("AuthMode",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[2]).authMode, 3U));
                                         VerifyOrReturn(CheckValueNonNull(
                                             "Subjects", ((MTRAccessControlClusterAccessControlEntry *) actualValue[2]).subjects));
                                         VerifyOrReturn(CheckValue("Subjects",
                                             [((MTRAccessControlClusterAccessControlEntry *) actualValue[2]).subjects count],
                                             static_cast<uint32_t>(4)));
                                         VerifyOrReturn(CheckValue("",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[2]).subjects[0], 12ULL));
                                         VerifyOrReturn(CheckValue("",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[2]).subjects[1], 13ULL));
                                         VerifyOrReturn(CheckValue("",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[2]).subjects[2], 14ULL));
                                         VerifyOrReturn(CheckValue("",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[2]).subjects[3], 15ULL));
                                         VerifyOrReturn(CheckValueNonNull(
                                             "Targets", ((MTRAccessControlClusterAccessControlEntry *) actualValue[2]).targets));
                                         VerifyOrReturn(CheckValue("Targets",
                                             [((MTRAccessControlClusterAccessControlEntry *) actualValue[2]).targets count],
                                             static_cast<uint32_t>(3)));
                                         VerifyOrReturn(CheckValueNull("Cluster",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[2])
                                                     .targets[0])
                                                 .cluster));
                                         VerifyOrReturn(CheckValueNonNull("Endpoint",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[2])
                                                     .targets[0])
                                                 .endpoint));
                                         VerifyOrReturn(CheckValue("Endpoint",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[2])
                                                     .targets[0])
                                                 .endpoint,
                                             16U));
                                         VerifyOrReturn(CheckValueNull("DeviceType",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[2])
                                                     .targets[0])
                                                 .deviceType));
                                         VerifyOrReturn(CheckValueNonNull("Cluster",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[2])
                                                     .targets[1])
                                                 .cluster));
                                         VerifyOrReturn(CheckValue("Cluster",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[2])
                                                     .targets[1])
                                                 .cluster,
                                             17UL));
                                         VerifyOrReturn(CheckValueNull("Endpoint",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[2])
                                                     .targets[1])
                                                 .endpoint));
                                         VerifyOrReturn(CheckValueNull("DeviceType",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[2])
                                                     .targets[1])
                                                 .deviceType));
                                         VerifyOrReturn(CheckValueNonNull("Cluster",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[2])
                                                     .targets[2])
                                                 .cluster));
                                         VerifyOrReturn(CheckValue("Cluster",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[2])
                                                     .targets[2])
                                                 .cluster,
                                             18UL));
                                         VerifyOrReturn(CheckValueNonNull("Endpoint",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[2])
                                                     .targets[2])
                                                 .endpoint));
                                         VerifyOrReturn(CheckValue("Endpoint",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[2])
                                                     .targets[2])
                                                 .endpoint,
                                             19U));
                                         VerifyOrReturn(CheckValueNull("DeviceType",
                                             ((MTRAccessControlClusterTarget *) ((MTRAccessControlClusterAccessControlEntry *)
                                                                                     actualValue[2])
                                                     .targets[2])
                                                 .deviceType));
                                         VerifyOrReturn(CheckValue("FabricIndex",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[2]).fabricIndex, 1U));
                                     }

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRestoreAcl_19()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).subjects = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) 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");
        __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",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).privilege, 5U));
                                         VerifyOrReturn(CheckValue("AuthMode",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).authMode, 2U));
                                         VerifyOrReturn(CheckValueNull(
                                             "Subjects", ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).subjects));
                                         VerifyOrReturn(CheckValueNull(
                                             "Targets", ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).targets));
                                         VerifyOrReturn(CheckValue("FabricIndex",
                                             ((MTRAccessControlClusterAccessControlEntry *) actualValue[0]).fabricIndex, 1U));
                                     }

                                     NextTest();
                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestValidateResourceMinimaSubjectsPerAccessControlEntry_21()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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");
        __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");
        __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], 3U));

            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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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] = [[MTRAccessControlClusterExtensionEntry alloc] init];
            ((MTRAccessControlClusterExtensionEntry *) temp_0[0]).data = mDOkEmpty.HasValue()
                ? [NSData dataWithBytes:mDOkEmpty.Value().data() length:mDOkEmpty.Value().size()]
                : [[NSData alloc] initWithBytes:"\x17\x18" length:2];
            ((MTRAccessControlClusterExtensionEntry *) 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");
        __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", ((MTRAccessControlClusterExtensionEntry *) actualValue[0]).data,
                                              mDOkEmpty.HasValue() ? [NSData dataWithBytes:mDOkEmpty.Value().data()
                                                                                    length:mDOkEmpty.Value().size()]
                                                                   : [[NSData alloc] initWithBytes:"\x17\x18" length:2]

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

                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestTh1WritesDutEndpoint0AccessControlClusterExtensionAttributeValueIsListOfAccessControlExtensionStructContaining1Element1structDataFieldDOkSingle17d00000f1ff01003d48656c6c6f20576f726c642e205468697320697320612073696e676c6520656c656d656e74206c6976696e6720617320612063686172737472696e670018_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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] = [[MTRAccessControlClusterExtensionEntry alloc] init];
            ((MTRAccessControlClusterExtensionEntry *) 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];
            ((MTRAccessControlClusterExtensionEntry *) 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");
        __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", ((MTRAccessControlClusterExtensionEntry *) 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",
                                              ((MTRAccessControlClusterExtensionEntry *) actualValue[0]).fabricIndex,
                                              CurrentFabricIndex));
                                      }

                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestTh1WritesDutEndpoint0AccessControlClusterExtensionAttributeValueIsListOfAccessControlExtensionStructContaining1Element1structDataFieldDOkFull17d00000f1ff01003d48656c6c6f20576f726c642e205468697320697320612073696e676c6520656c656d656e74206c6976696e6720617320612063686172737472696e6700d00000f1ff02003148656c6c6f20576f726c642e205468697320697320612073696e676c6520656c656d656e7420616761696e2e2e2e2e2e0018_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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] = [[MTRAccessControlClusterExtensionEntry alloc] init];
            ((MTRAccessControlClusterExtensionEntry *) 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];
            ((MTRAccessControlClusterExtensionEntry *) 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");
        __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", ((MTRAccessControlClusterExtensionEntry *) 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",
                                              ((MTRAccessControlClusterExtensionEntry *) actualValue[0]).fabricIndex,
                                              CurrentFabricIndex));
                                      }

                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestTh1WritesDutEndpoint0AccessControlClusterExtensionAttributeValueIsListOfAccessControlExtensionStructContaining1Element1structDataFieldDBadLength17d00000f1ff01003d48656c6c6f20576f726c642e205468697320697320612073696e676c6520656c656d656e74206c6976696e6720617320612063686172737472696e6700d00000f1ff02003248656c6c6f20576f726c642e205468697320697320612073696e676c6520656c656d656e7420616761696e2e2e2e2e2e2e0018_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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] = [[MTRAccessControlClusterExtensionEntry alloc] init];
            ((MTRAccessControlClusterExtensionEntry *) 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];
            ((MTRAccessControlClusterExtensionEntry *) 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");
        __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] = [[MTRAccessControlClusterExtensionEntry alloc] init];
            ((MTRAccessControlClusterExtensionEntry *) temp_0[0]).data = mDBadStruct.HasValue()
                ? [NSData dataWithBytes:mDBadStruct.Value().data() length:mDBadStruct.Value().size()]
                : [[NSData alloc] initWithBytes:"\x15\x18" length:2];
            ((MTRAccessControlClusterExtensionEntry *) 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");
        __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] = [[MTRAccessControlClusterExtensionEntry alloc] init];
            ((MTRAccessControlClusterExtensionEntry *) 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];
            ((MTRAccessControlClusterExtensionEntry *) 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");
        __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] = [[MTRAccessControlClusterExtensionEntry alloc] init];
            ((MTRAccessControlClusterExtensionEntry *) 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];
            ((MTRAccessControlClusterExtensionEntry *) 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");
        __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] = [[MTRAccessControlClusterExtensionEntry alloc] init];
            ((MTRAccessControlClusterExtensionEntry *) 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];
            ((MTRAccessControlClusterExtensionEntry *) 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");
        __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] = [[MTRAccessControlClusterExtensionEntry alloc] init];
            ((MTRAccessControlClusterExtensionEntry *) 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];
            ((MTRAccessControlClusterExtensionEntry *) 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");
        __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] = [[MTRAccessControlClusterExtensionEntry alloc] init];
            ((MTRAccessControlClusterExtensionEntry *) temp_0[0]).data = mDBadNone.HasValue()
                ? [NSData dataWithBytes:mDBadNone.Value().data() length:mDBadNone.Value().size()]
                : [[NSData alloc] initWithBytes:"" length:0];
            ((MTRAccessControlClusterExtensionEntry *) 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");
        __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] = [[MTRAccessControlClusterExtensionEntry alloc] init];
            ((MTRAccessControlClusterExtensionEntry *) temp_0[0]).data = mDOkEmpty.HasValue()
                ? [NSData dataWithBytes:mDOkEmpty.Value().data() length:mDOkEmpty.Value().size()]
                : [[NSData alloc] initWithBytes:"\x17\x18" length:2];
            ((MTRAccessControlClusterExtensionEntry *) temp_0[0]).fabricIndex = [CurrentFabricIndex copy];

            temp_0[1] = [[MTRAccessControlClusterExtensionEntry alloc] init];
            ((MTRAccessControlClusterExtensionEntry *) 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];
            ((MTRAccessControlClusterExtensionEntry *) 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");
        __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", ((MTRAccessControlClusterExtensionEntry *) actualValue[0]).data,
                                              mDOkEmpty.HasValue() ? [NSData dataWithBytes:mDOkEmpty.Value().data()
                                                                                    length:mDOkEmpty.Value().size()]
                                                                   : [[NSData alloc] initWithBytes:"\x17\x18" length:2]

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

                                      NextTest();
                                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTh1WritesDutEndpoint0AccessControlClusterExtensionAttributeValueIsAnEmptyList_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic 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");
        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic 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");
        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic 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");
        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic 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");
        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic 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");
        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic 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");
        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic 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");
        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic 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");
        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic 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");
        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic 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");
        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic 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");
        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic 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");
        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic 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");
        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic 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");
        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic 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");
        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic 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");
        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic 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");
        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic 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");
        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic 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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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.colorTemperature = [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");
        __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.colorTemperature = [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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
                                                                              endpointID:@(0)
                                                                                   queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBootReasonsWithCompletion:^(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>("bootReasons", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("bootReasons", [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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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_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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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 = [[MTRApplicationLauncherClusterApplication alloc] init];
        ((MTRApplicationLauncherClusterApplication *) params.application).catalogVendorId = mCatalogVendorId.HasValue()
            ? [NSNumber numberWithUnsignedShort:mCatalogVendorId.Value()]
            : [NSNumber numberWithUnsignedShort:123U];
        ((MTRApplicationLauncherClusterApplication *) 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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentAppWithCompletion:^(
            MTRApplicationLauncherClusterApplicationEP * _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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentChannelWithCompletion:^(MTRChannelClusterChannelInfo * _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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLineupWithCompletion:^(MTRChannelClusterLineupInfo * _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");
        __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");
        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentChannelWithCompletion:^(MTRChannelClusterChannelInfo * _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");
        __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");
        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentChannelWithCompletion:^(MTRChannelClusterChannelInfo * _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", "ChannelInfo", "ChannelInfo"));
                }

                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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster stopPlaybackWithCompletion:^(
            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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSampledPositionWithCompletion:^(
            MTRMediaPlaybackClusterPlaybackPosition * _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");
        __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");
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSampledPositionWithCompletion:^(
            MTRMediaPlaybackClusterPlaybackPosition * _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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSampledPositionWithCompletion:^(
            MTRMediaPlaybackClusterPlaybackPosition * _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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeApplicationWithCompletion:^(
            MTRApplicationBasicClusterApplicationBasicApplication * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the Application attribute Error: %@", err);

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

            VerifyOrReturn(CheckConstraintType("application", "ApplicationBasicApplication", "ApplicationBasicApplication"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheStatusAttribute_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:112233ULL];
                ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:3U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:2U];
            ((MTRAccessControlClusterAccessControlEntry *) 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;

                ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).targets = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) 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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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_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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
            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 optional attribute(MinConstPressure) attribute in AttributeList from the DUT\n");
            if (ShouldSkip("PCC.S.A0003")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeMinConstPressureAttributeInAttributeListFromTheDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool,
                " ***** Test Step 5 : TH reads optional attribute(MaxConstPressure) attribute in AttributeList from the DUT\n");
            if (ShouldSkip("PCC.S.A0004")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeMaxConstPressureAttributeInAttributeListFromTheDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool,
                " ***** Test Step 6 : TH reads optional attribute(MinCompPressure) attribute in AttributeList from the DUT\n");
            if (ShouldSkip("PCC.S.A0005")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeMinCompPressureAttributeInAttributeListFromTheDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool,
                " ***** Test Step 7 : TH reads optional attribute(MaxCompPressure) attribute in AttributeList from the DUT\n");
            if (ShouldSkip("PCC.S.A0006")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeMaxCompPressureAttributeInAttributeListFromTheDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool,
                " ***** Test Step 8 : TH reads optional attribute(MinConstSpeed) attribute in AttributeList from the DUT\n");
            if (ShouldSkip("PCC.S.A0007")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeMinConstSpeedAttributeInAttributeListFromTheDut_8();
            break;
        case 9:
            ChipLogProgress(chipTool,
                " ***** Test Step 9 : TH reads optional attribute(MaxConstSpeed) attribute in AttributeList from the DUT\n");
            if (ShouldSkip("PCC.S.A0008")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeMaxConstSpeedAttributeInAttributeListFromTheDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool,
                " ***** Test Step 10 : TH reads optional attribute(MinConstFlow) attribute in AttributeList from the DUT\n");
            if (ShouldSkip("PCC.S.A0009")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeMinConstFlowAttributeInAttributeListFromTheDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool,
                " ***** Test Step 11 : TH reads optional attribute(MaxConstFlow) attribute in AttributeList from the DUT\n");
            if (ShouldSkip("PCC.S.A000a")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeMaxConstFlowAttributeInAttributeListFromTheDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool,
                " ***** Test Step 12 : TH reads optional attribute(MinConstTemp) attribute in AttributeList from the DUT\n");
            if (ShouldSkip("PCC.S.A000b")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeMinConstTempAttributeInAttributeListFromTheDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool,
                " ***** Test Step 13 : TH reads optional attribute(MaxConstTemp) attribute in AttributeList from the DUT\n");
            if (ShouldSkip("PCC.S.A000c")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeMaxConstTempAttributeInAttributeListFromTheDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool,
                " ***** Test Step 14 : TH reads optional attribute(PumpStatus) attribute in AttributeList from the DUT\n");
            if (ShouldSkip("PCC.S.A0010")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributePumpStatusAttributeInAttributeListFromTheDut_14();
            break;
        case 15:
            ChipLogProgress(
                chipTool, " ***** Test Step 15 : TH reads optional attribute(Speed) attribute in AttributeList from the DUT\n");
            if (ShouldSkip("PCC.S.A0014")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeSpeedAttributeInAttributeListFromTheDut_15();
            break;
        case 16:
            ChipLogProgress(chipTool,
                " ***** Test Step 16 : TH reads optional attribute(LifetimeRunningHours) attribute in AttributeList from the "
                "DUT\n");
            if (ShouldSkip("PCC.S.A0015")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeLifetimeRunningHoursAttributeInAttributeListFromTheDut_16();
            break;
        case 17:
            ChipLogProgress(
                chipTool, " ***** Test Step 17 : TH reads optional attribute(Power) attribute in AttributeList from the DUT\n");
            if (ShouldSkip("PCC.S.A0016")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributePowerAttributeInAttributeListFromTheDut_17();
            break;
        case 18:
            ChipLogProgress(chipTool,
                " ***** Test Step 18 : TH reads optional attribute(LifetimeEnergyConsumed) attribute in AttributeList from the "
                "DUT\n");
            if (ShouldSkip("PCC.S.A0017")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeLifetimeEnergyConsumedAttributeInAttributeListFromTheDut_18();
            break;
        case 19:
            ChipLogProgress(chipTool,
                " ***** Test Step 19 : TH reads optional attribute(ControlMode) attribute in AttributeList from the DUT\n");
            if (ShouldSkip("PCC.S.A0021")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeControlModeAttributeInAttributeListFromTheDut_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : TH reads the AcceptedCommandList attribute from the DUT\n");
            err = TestThReadsTheAcceptedCommandListAttributeFromTheDut_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : TH reads the GeneratedCommandList attribute from the DUT\n");
            err = TestThReadsTheGeneratedCommandListAttributeFromTheDut_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 TestThReadsTheClusterRevisionAttributeFromTheDut_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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, 3U));
            }

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

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsTheFeatureMapAttributeFromTheDut_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 TestThReadsTheAttributeListAttributeFromTheDut_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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_19()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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_20()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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_21()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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.A0020 && PCC.M.ControlModeConstSpeed")) {
                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.A0011 && PCC.M.ControlModeConstSpeed")) {
                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.A0020 && PCC.M.ControlModeConstSpeed")) {
                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.A0011 && PCC.M.ControlModeConstSpeed")) {
                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.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.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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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.A0021 && PCC.M.ControlModeConstSpeed")) {
                NextTest();
                return;
            }
            err = TestWrite0ToTheControlModeAttributeToDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Reads the attribute: EffectiveControlMode\n");
            if (ShouldSkip("PCC.S.A0012 && PCC.M.ControlModeConstSpeed")) {
                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.A0021 && PCC.M.ControlModeConstPressure")) {
                NextTest();
                return;
            }
            err = TestWrite1ToTheControlModeAttributeToDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Reads the attribute: EffectiveControlMode\n");
            if (ShouldSkip("PCC.S.A0012 && PCC.M.ControlModeConstPressure")) {
                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.A0021 && PCC.M.ControlModeCompPressure")) {
                NextTest();
                return;
            }
            err = TestWrite2ToTheControlModeAttributeToDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Reads the attribute: EffectiveControlMode\n");
            if (ShouldSkip("PCC.S.A0012 && PCC.M.ControlModeCompPressure")) {
                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.A0021 && PCC.M.ControlModeConstFlow")) {
                NextTest();
                return;
            }
            err = TestWrite3ToTheControlModeAttributeToDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Reads the attribute: EffectiveControlMode\n");
            if (ShouldSkip("PCC.S.A0012 && PCC.M.ControlModeConstFlow")) {
                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.A0021 && PCC.M.ControlModeConstTemp")) {
                NextTest();
                return;
            }
            err = TestWrite5ToTheControlModeAttributeToDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Reads the attribute: EffectiveControlMode\n");
            if (ShouldSkip("PCC.S.A0012 && PCC.M.ControlModeConstTemp")) {
                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.A0021 && PCC.M.ControlModeAuto")) {
                NextTest();
                return;
            }
            err = TestWrite7ToTheControlModeAttributeToDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Reads the attribute: EffectiveControlMode\n");
            if (ShouldSkip("PCC.S.A0012 && PCC.M.ControlModeAuto")) {
                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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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("temperature display mode", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesAValueOfGreaterThan1ToTemperatureDisplayModeAttributeOfDut_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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");
        __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("temperature display mode", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesAValueOf0ToKeypadLockoutAttributeOfDut_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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");
        __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("keypad lockout", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesAValueOf1ToKeypadLockoutAttributeOfDut_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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");
        __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("keypad lockout", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesAValueOf2ToKeypadLockoutAttributeOfDut_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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");
        __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("keypad lockout", actualValue, 2U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesAValueOf3ToKeypadLockoutAttributeOfDut_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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");
        __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("keypad lockout", actualValue, 3U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesAValueOf4ToKeypadLockoutAttributeOfDut_21()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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");
        __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("keypad lockout", actualValue, 4U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesAValueOf5ToKeypadLockoutAttributeOfDut_24()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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");
        __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("keypad lockout", actualValue, 5U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesAValueOfGreaterThan5ToKeypadLockoutAttributeOfDut_27()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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");
        __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("keypad lockout", actualValue, 5U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesAValueOf0ToScheduleProgrammingVisibilityAttributeOfDut_29()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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");
        __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("schedule programming visibility", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesAValueOf1ToScheduleProgrammingVisibilityAttributeOfDut_32()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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");
        __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("schedule programming visibility", actualValue, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesAValueOfGreaterThan1ToScheduleProgrammingVisibilityAttributeOfDut_35()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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");
        __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("schedule programming visibility", 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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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 optional attribute (DetachedRoleCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A000e")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeDetachedRoleCountInAttributeList_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : TH reads optional attribute (ChildRoleCount) AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A001f")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeChildRoleCountAttributeList_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : TH reads optional attribute (RouterRoleCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0010")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeRouterRoleCountInAttributeList_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : TH reads optional attribute (LeaderRoleCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0011")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeLeaderRoleCountInAttributeList_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : TH reads optional attribute (AttachAttemptCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0012")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeAttachAttemptCountInAttributeList_13();
            break;
        case 14:
            ChipLogProgress(
                chipTool, " ***** Test Step 14 : TH reads optional attribute (PartitionIdChangeCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0013")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributePartitionIdChangeCountInAttributeList_14();
            break;
        case 15:
            ChipLogProgress(chipTool,
                " ***** Test Step 15 : TH reads optional attribute (BetterPartitionAttachAttemptCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0014")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeBetterPartitionAttachAttemptCountInAttributeList_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : TH reads optional attribute (ParentChangeCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0015")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeParentChangeCountInAttributeList_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : TH reads optional attribute (TxTotalCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0016")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeTxTotalCountInAttributeList_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : TH reads optional attribute (TxUnicastCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0017")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeTxUnicastCountInAttributeList_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : TH reads optional attribute (TxBroadcastCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0018")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeTxBroadcastCountInAttributeList_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : TH reads optional attribute (TxAckRequestedCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0019")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeTxAckRequestedCountInAttributeList_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : TH reads optional attribute (TxAckedCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A001a")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeTxAckedCountInAttributeList_21();
            break;
        case 22:
            ChipLogProgress(
                chipTool, " ***** Test Step 22 : TH reads optional attribute (TxNoAckRequestedCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A001b")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeTxNoAckRequestedCountInAttributeList_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : TH reads optional attributes (TxDataCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A001c")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributesTxDataCountInAttributeList_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : TH reads optional attribute (TxDataPollCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A001d")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeTxDataPollCountInAttributeList_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : TH reads optional attribute (TxBeaconCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A001e")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeTxBeaconCountInAttributeList_25();
            break;
        case 26:
            ChipLogProgress(
                chipTool, " ***** Test Step 26 : TH reads optional attribute (TxBeaconRequestCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A001f")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeTxBeaconRequestCountInAttributeList_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : TH reads optional attribute (TxOtherCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0020")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeTxOtherCountInAttributeList_27();
            break;
        case 28:
            ChipLogProgress(chipTool, " ***** Test Step 28 : TH reads optional attribute (TxRetryCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0021")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeTxRetryCountInAttributeList_28();
            break;
        case 29:
            ChipLogProgress(
                chipTool, " ***** Test Step 29 : TH reads optional attribute (TxDirectMaxRetryExpiryCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0022")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeTxDirectMaxRetryExpiryCountInAttributeList_29();
            break;
        case 30:
            ChipLogProgress(
                chipTool, " ***** Test Step 30 : TH reads optional attribute (TxIndirectMaxRetryExpiryCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0023")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeTxIndirectMaxRetryExpiryCountInAttributeList_30();
            break;
        case 31:
            ChipLogProgress(chipTool, " ***** Test Step 31 : TH reads optional attribute (TxErrCcaCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0024")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeTxErrCcaCountInAttributeList_31();
            break;
        case 32:
            ChipLogProgress(chipTool, " ***** Test Step 32 : TH reads optional attribute (TxErrAbortCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0025")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeTxErrAbortCountInAttributeList_32();
            break;
        case 33:
            ChipLogProgress(
                chipTool, " ***** Test Step 33 : TH reads optional attribute (TxErrBusyChannelCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0026")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeTxErrBusyChannelCountInAttributeList_33();
            break;
        case 34:
            ChipLogProgress(chipTool, " ***** Test Step 34 : TH reads optional attribute (RxTotalCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0027")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeRxTotalCountInAttributeList_34();
            break;
        case 35:
            ChipLogProgress(chipTool, " ***** Test Step 35 : TH reads optional attribute (RxUnicastCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0028")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeRxUnicastCountInAttributeList_35();
            break;
        case 36:
            ChipLogProgress(chipTool, " ***** Test Step 36 : TH reads optional attribute (RxBroadcastCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0029")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeRxBroadcastCountInAttributeList_36();
            break;
        case 37:
            ChipLogProgress(chipTool, " ***** Test Step 37 : TH reads optional attribute (RxDataCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A002a")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeRxDataCountInAttributeList_37();
            break;
        case 38:
            ChipLogProgress(chipTool, " ***** Test Step 38 : TH reads optional attribute (RxDataPollCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A002b")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeRxDataPollCountInAttributeList_38();
            break;
        case 39:
            ChipLogProgress(chipTool, " ***** Test Step 39 : TH reads optional attribute (RxBeaconCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A002c")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeRxBeaconCountInAttributeList_39();
            break;
        case 40:
            ChipLogProgress(
                chipTool, " ***** Test Step 40 : TH reads optional attribute (RxBeaconRequestCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A002d")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeRxBeaconRequestCountInAttributeList_40();
            break;
        case 41:
            ChipLogProgress(chipTool, " ***** Test Step 41 : TH reads optional attribute (RxOtherCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A002e")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeRxOtherCountInAttributeList_41();
            break;
        case 42:
            ChipLogProgress(
                chipTool, " ***** Test Step 42 : TH reads optional attribute (RxAddressFilteredCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A002f")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeRxAddressFilteredCountInAttributeList_42();
            break;
        case 43:
            ChipLogProgress(
                chipTool, " ***** Test Step 43 : TH reads optional attribute (RxDestAddrFilteredCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0030")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeRxDestAddrFilteredCountInAttributeList_43();
            break;
        case 44:
            ChipLogProgress(chipTool, " ***** Test Step 44 : TH reads optional attribute (RxDuplicatedCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0031")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeRxDuplicatedCountInAttributeList_44();
            break;
        case 45:
            ChipLogProgress(chipTool, " ***** Test Step 45 : TH reads optional attribute (RxErrNoFrameCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0032")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeRxErrNoFrameCountInAttributeList_45();
            break;
        case 46:
            ChipLogProgress(
                chipTool, " ***** Test Step 46 : TH reads optional attribute (RxErrUnknownNeighborCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0033")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeRxErrUnknownNeighborCountInAttributeList_46();
            break;
        case 47:
            ChipLogProgress(
                chipTool, " ***** Test Step 47 : TH reads optional attribute (RxErrInvalidScrAddrCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0034")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeRxErrInvalidScrAddrCountInAttributeList_47();
            break;
        case 48:
            ChipLogProgress(chipTool, " ***** Test Step 48 : TH reads optional attribute (RxErrSecCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0035")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeRxErrSecCountInAttributeList_48();
            break;
        case 49:
            ChipLogProgress(chipTool, " ***** Test Step 49 : TH reads optional attribute (RxErrFcsCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0036")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeRxErrFcsCountInAttributeList_49();
            break;
        case 50:
            ChipLogProgress(chipTool, " ***** Test Step 50 : TH reads optional attribute (RxErrOtherCount) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0037")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeRxErrOtherCountInAttributeList_50();
            break;
        case 51:
            ChipLogProgress(chipTool, " ***** Test Step 51 : Read the optional attribute (ActiveTimestamp) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0038")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeActiveTimestampInAttributeList_51();
            break;
        case 52:
            ChipLogProgress(chipTool, " ***** Test Step 52 : Read the optional attribute (PendingTimestamp) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A0039")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributePendingTimestampInAttributeList_52();
            break;
        case 53:
            ChipLogProgress(chipTool, " ***** Test Step 53 : Read the optional attribute (Delay) in AttributeList\n");
            if (ShouldSkip("DGTHREAD.S.A003a")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeDelayInAttributeList_53();
            break;
        case 54:
            ChipLogProgress(chipTool, " ***** Test Step 54 : TH reads AcceptedCommandList from DUT\n");
            err = TestThReadsAcceptedCommandListFromDut_54();
            break;
        case 55:
            ChipLogProgress(chipTool, " ***** Test Step 55 : TH reads GeneratedCommandList from DUT\n");
            err = TestThReadsGeneratedCommandListFromDut_55();
            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;
        }

        // 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 = 56;

    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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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 TestThReadsOptionalAttributeDetachedRoleCountInAttributeList_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 optional attribute (DetachedRoleCount) 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 TestThReadsOptionalAttributeChildRoleCountAttributeList_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 optional attribute (ChildRoleCount) 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 TestThReadsOptionalAttributeRouterRoleCountInAttributeList_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 optional attribute (RouterRoleCount) 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 TestThReadsOptionalAttributeLeaderRoleCountInAttributeList_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 optional attribute (LeaderRoleCount) 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 TestThReadsOptionalAttributeAttachAttemptCountInAttributeList_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 optional attribute (AttachAttemptCount) 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 TestThReadsOptionalAttributePartitionIdChangeCountInAttributeList_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 optional attribute (PartitionIdChangeCount) 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 TestThReadsOptionalAttributeBetterPartitionAttachAttemptCountInAttributeList_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 optional attribute (BetterPartitionAttachAttemptCount) 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 TestThReadsOptionalAttributeParentChangeCountInAttributeList_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 optional attribute (ParentChangeCount) 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 TestThReadsOptionalAttributeTxTotalCountInAttributeList_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 optional attribute (TxTotalCount) 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 TestThReadsOptionalAttributeTxUnicastCountInAttributeList_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 optional attribute (TxUnicastCount) in AttributeList 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 TestThReadsOptionalAttributeTxBroadcastCountInAttributeList_19()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 optional attribute (TxBroadcastCount) in AttributeList Error: %@", err);

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeTxAckRequestedCountInAttributeList_20()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 optional attribute (TxAckRequestedCount) in AttributeList Error: %@", err);

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeTxAckedCountInAttributeList_21()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 optional attribute (TxAckedCount) 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 TestThReadsOptionalAttributeTxNoAckRequestedCountInAttributeList_22()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 optional attribute (TxNoAckRequestedCount) in AttributeList Error: %@", err);

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributesTxDataCountInAttributeList_23()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 optional attributes (TxDataCount) in AttributeList Error: %@", err);

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeTxDataPollCountInAttributeList_24()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 optional attribute (TxDataPollCount) in AttributeList Error: %@", err);

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeTxBeaconCountInAttributeList_25()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 optional attribute (TxBeaconCount) in AttributeList Error: %@", err);

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeTxBeaconRequestCountInAttributeList_26()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 optional attribute (TxBeaconRequestCount) in AttributeList Error: %@", err);

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeTxOtherCountInAttributeList_27()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 optional attribute (TxOtherCount) in AttributeList Error: %@", err);

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeTxRetryCountInAttributeList_28()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 optional attribute (TxRetryCount) 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 TestThReadsOptionalAttributeTxDirectMaxRetryExpiryCountInAttributeList_29()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 optional attribute (TxDirectMaxRetryExpiryCount) 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 TestThReadsOptionalAttributeTxIndirectMaxRetryExpiryCountInAttributeList_30()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 optional attribute (TxIndirectMaxRetryExpiryCount) 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 TestThReadsOptionalAttributeTxErrCcaCountInAttributeList_31()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 optional attribute (TxErrCcaCount) 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 TestThReadsOptionalAttributeTxErrAbortCountInAttributeList_32()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 optional attribute (TxErrAbortCount) in AttributeList Error: %@", err);

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeTxErrBusyChannelCountInAttributeList_33()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 optional attribute (TxErrBusyChannelCount) in AttributeList Error: %@", err);

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeRxTotalCountInAttributeList_34()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 optional attribute (RxTotalCount) 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 TestThReadsOptionalAttributeRxUnicastCountInAttributeList_35()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 optional attribute (RxUnicastCount) 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 TestThReadsOptionalAttributeRxBroadcastCountInAttributeList_36()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 optional attribute (RxBroadcastCount) 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 TestThReadsOptionalAttributeRxDataCountInAttributeList_37()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 optional attribute (RxDataCount) 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 TestThReadsOptionalAttributeRxDataPollCountInAttributeList_38()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 optional attribute (RxDataPollCount) 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 TestThReadsOptionalAttributeRxBeaconCountInAttributeList_39()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 optional attribute (RxBeaconCount) 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 TestThReadsOptionalAttributeRxBeaconRequestCountInAttributeList_40()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 optional attribute (RxBeaconRequestCount) in AttributeList Error: %@", err);

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeRxOtherCountInAttributeList_41()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 optional attribute (RxOtherCount) in AttributeList Error: %@", err);

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeRxAddressFilteredCountInAttributeList_42()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 optional attribute (RxAddressFilteredCount) in AttributeList Error: %@", err);

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeRxDestAddrFilteredCountInAttributeList_43()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 optional attribute (RxDestAddrFilteredCount) in AttributeList Error: %@", err);

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeRxDuplicatedCountInAttributeList_44()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 optional attribute (RxDuplicatedCount) in AttributeList Error: %@", err);

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeRxErrNoFrameCountInAttributeList_45()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 optional attribute (RxErrNoFrameCount) in AttributeList Error: %@", err);

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeRxErrUnknownNeighborCountInAttributeList_46()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 optional attribute (RxErrUnknownNeighborCount) 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 TestThReadsOptionalAttributeRxErrInvalidScrAddrCountInAttributeList_47()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 optional attribute (RxErrInvalidScrAddrCount) in AttributeList Error: %@", err);

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeRxErrSecCountInAttributeList_48()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 optional attribute (RxErrSecCount) in AttributeList Error: %@", err);

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeRxErrFcsCountInAttributeList_49()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 optional attribute (RxErrFcsCount) in AttributeList Error: %@", err);

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsOptionalAttributeRxErrOtherCountInAttributeList_50()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 optional attribute (RxErrOtherCount) in AttributeList Error: %@", err);

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeActiveTimestampInAttributeList_51()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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_52()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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_53()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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_54()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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_55()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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("label list", [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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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("label list", [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");
        __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");
        __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("label list", [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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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", ((MTRTargetNavigatorClusterTargetInfo *) actualValue[0]).identifier, 1U));
                VerifyOrReturn(
                    CheckValueAsString("name", ((MTRTargetNavigatorClusterTargetInfo *) actualValue[0]).name, @"exampleName"));
                VerifyOrReturn(CheckValue("identifier", ((MTRTargetNavigatorClusterTargetInfo *) actualValue[1]).identifier, 2U));
                VerifyOrReturn(
                    CheckValueAsString("name", ((MTRTargetNavigatorClusterTargetInfo *) actualValue[1]).name, @"exampleName"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeCurrentNavigatorTarget_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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", ((MTRAudioOutputClusterOutputInfo *) actualValue[0]).index, 1U));
                VerifyOrReturn(CheckValue("outputType", ((MTRAudioOutputClusterOutputInfo *) actualValue[0]).outputType, 0U));
                VerifyOrReturn(CheckValueAsString("name", ((MTRAudioOutputClusterOutputInfo *) actualValue[0]).name, @"HDMI"));
                VerifyOrReturn(CheckValue("index", ((MTRAudioOutputClusterOutputInfo *) actualValue[1]).index, 2U));
                VerifyOrReturn(CheckValue("outputType", ((MTRAudioOutputClusterOutputInfo *) actualValue[1]).outputType, 0U));
                VerifyOrReturn(CheckValueAsString("name", ((MTRAudioOutputClusterOutputInfo *) actualValue[1]).name, @"HDMI"));
                VerifyOrReturn(CheckValue("index", ((MTRAudioOutputClusterOutputInfo *) actualValue[2]).index, 3U));
                VerifyOrReturn(CheckValue("outputType", ((MTRAudioOutputClusterOutputInfo *) actualValue[2]).outputType, 0U));
                VerifyOrReturn(CheckValueAsString("name", ((MTRAudioOutputClusterOutputInfo *) actualValue[2]).name, @"HDMI"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeCurrentAudioOutput_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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");
        __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");
        __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");
        __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", ((MTRAudioOutputClusterOutputInfo *) actualValue[0]).index, 1U));
                VerifyOrReturn(CheckValue("outputType", ((MTRAudioOutputClusterOutputInfo *) actualValue[0]).outputType, 0U));
                VerifyOrReturn(CheckValueAsString("name", ((MTRAudioOutputClusterOutputInfo *) actualValue[0]).name, @"HDMI Test"));
                VerifyOrReturn(CheckValue("index", ((MTRAudioOutputClusterOutputInfo *) actualValue[1]).index, 2U));
                VerifyOrReturn(CheckValue("outputType", ((MTRAudioOutputClusterOutputInfo *) actualValue[1]).outputType, 0U));
                VerifyOrReturn(CheckValueAsString("name", ((MTRAudioOutputClusterOutputInfo *) actualValue[1]).name, @"HDMI"));
                VerifyOrReturn(CheckValue("index", ((MTRAudioOutputClusterOutputInfo *) actualValue[2]).index, 3U));
                VerifyOrReturn(CheckValue("outputType", ((MTRAudioOutputClusterOutputInfo *) actualValue[2]).outputType, 0U));
                VerifyOrReturn(CheckValueAsString("name", ((MTRAudioOutputClusterOutputInfo *) 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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
                                                                               endpointID:@(1)
                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentAppWithCompletion:^(
            MTRApplicationLauncherClusterApplicationEP * _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");
        __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 = [[MTRApplicationLauncherClusterApplication alloc] init];
        ((MTRApplicationLauncherClusterApplication *) params.application).catalogVendorId = [NSNumber numberWithUnsignedShort:123U];
        ((MTRApplicationLauncherClusterApplication *) 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");
        __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 = [[MTRApplicationLauncherClusterApplication alloc] init];
        ((MTRApplicationLauncherClusterApplication *) params.application).catalogVendorId = [NSNumber numberWithUnsignedShort:123U];
        ((MTRApplicationLauncherClusterApplication *) 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");
        __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 = [[MTRApplicationLauncherClusterApplication alloc] init];
        ((MTRApplicationLauncherClusterApplication *) params.application).catalogVendorId = [NSNumber numberWithUnsignedShort:123U];
        ((MTRApplicationLauncherClusterApplication *) 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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeApplicationWithCompletion:^(
            MTRApplicationBasicClusterApplicationBasicApplication * _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",
                    ((MTRApplicationBasicClusterApplicationBasicApplication *) actualValue).catalogVendorId, 123U));
                VerifyOrReturn(CheckValueAsString("applicationId",
                    ((MTRApplicationBasicClusterApplicationBasicApplication *) actualValue).applicationId, @"applicationId"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeApplicationVersion_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSampledPositionWithCompletion:^(
            MTRMediaPlaybackClusterPlaybackPosition * _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", ((MTRMediaPlaybackClusterPlaybackPosition *) actualValue).updatedAt, 0ULL));
                VerifyOrReturn(CheckValueNonNull("position", ((MTRMediaPlaybackClusterPlaybackPosition *) actualValue).position));
                VerifyOrReturn(CheckValue("position", ((MTRMediaPlaybackClusterPlaybackPosition *) actualValue).position, 0ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributePlaybackSpeed_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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");
        __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");
        __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");
        __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");
        __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");
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster stopPlaybackWithCompletion:^(
            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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSampledPositionWithCompletion:^(
            MTRMediaPlaybackClusterPlaybackPosition * _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", ((MTRMediaPlaybackClusterPlaybackPosition *) actualValue).updatedAt, 0ULL));
                VerifyOrReturn(CheckValueNonNull("position", ((MTRMediaPlaybackClusterPlaybackPosition *) actualValue).position));
                VerifyOrReturn(CheckValue("position", ((MTRMediaPlaybackClusterPlaybackPosition *) actualValue).position, 500ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMediaPlaybackSkipBackwardCommand_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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");
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSampledPositionWithCompletion:^(
            MTRMediaPlaybackClusterPlaybackPosition * _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", ((MTRMediaPlaybackClusterPlaybackPosition *) actualValue).updatedAt, 0ULL));
                VerifyOrReturn(CheckValueNonNull("position", ((MTRMediaPlaybackClusterPlaybackPosition *) actualValue).position));
                VerifyOrReturn(CheckValue("position", ((MTRMediaPlaybackClusterPlaybackPosition *) actualValue).position, 400ULL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMediaPlaybackSeekCommand_20()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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");
        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSampledPositionWithCompletion:^(
            MTRMediaPlaybackClusterPlaybackPosition * _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", ((MTRMediaPlaybackClusterPlaybackPosition *) actualValue).updatedAt, 0ULL));
                VerifyOrReturn(CheckValueNonNull("position", ((MTRMediaPlaybackClusterPlaybackPosition *) actualValue).position));
                VerifyOrReturn(CheckValue("position", ((MTRMediaPlaybackClusterPlaybackPosition *) 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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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", ((MTRChannelClusterChannelInfo *) actualValue[0]).majorNumber, 6U));
                VerifyOrReturn(CheckValue("minorNumber", ((MTRChannelClusterChannelInfo *) actualValue[0]).minorNumber, 0U));
                VerifyOrReturn(CheckValueAsString("name", ((MTRChannelClusterChannelInfo *) actualValue[0]).name, @"ABC"));
                VerifyOrReturn(
                    CheckValueAsString("callSign", ((MTRChannelClusterChannelInfo *) actualValue[0]).callSign, @"KAAL-TV"));
                VerifyOrReturn(CheckValueAsString(
                    "affiliateCallSign", ((MTRChannelClusterChannelInfo *) actualValue[0]).affiliateCallSign, @"KAAL"));
                VerifyOrReturn(CheckValue("majorNumber", ((MTRChannelClusterChannelInfo *) actualValue[1]).majorNumber, 9U));
                VerifyOrReturn(CheckValue("minorNumber", ((MTRChannelClusterChannelInfo *) actualValue[1]).minorNumber, 1U));
                VerifyOrReturn(CheckValueAsString("name", ((MTRChannelClusterChannelInfo *) actualValue[1]).name, @"PBS"));
                VerifyOrReturn(
                    CheckValueAsString("callSign", ((MTRChannelClusterChannelInfo *) actualValue[1]).callSign, @"KCTS-TV"));
                VerifyOrReturn(CheckValueAsString(
                    "affiliateCallSign", ((MTRChannelClusterChannelInfo *) actualValue[1]).affiliateCallSign, @"KCTS"));
                VerifyOrReturn(CheckValue("majorNumber", ((MTRChannelClusterChannelInfo *) actualValue[2]).majorNumber, 9U));
                VerifyOrReturn(CheckValue("minorNumber", ((MTRChannelClusterChannelInfo *) actualValue[2]).minorNumber, 2U));
                VerifyOrReturn(CheckValueAsString("name", ((MTRChannelClusterChannelInfo *) actualValue[2]).name, @"PBS Kids"));
                VerifyOrReturn(
                    CheckValueAsString("callSign", ((MTRChannelClusterChannelInfo *) actualValue[2]).callSign, @"KCTS-TV"));
                VerifyOrReturn(CheckValueAsString(
                    "affiliateCallSign", ((MTRChannelClusterChannelInfo *) actualValue[2]).affiliateCallSign, @"KCTS"));
                VerifyOrReturn(CheckValue("majorNumber", ((MTRChannelClusterChannelInfo *) actualValue[3]).majorNumber, 9U));
                VerifyOrReturn(CheckValue("minorNumber", ((MTRChannelClusterChannelInfo *) actualValue[3]).minorNumber, 3U));
                VerifyOrReturn(
                    CheckValueAsString("name", ((MTRChannelClusterChannelInfo *) actualValue[3]).name, @"World Channel"));
                VerifyOrReturn(
                    CheckValueAsString("callSign", ((MTRChannelClusterChannelInfo *) actualValue[3]).callSign, @"KCTS-TV"));
                VerifyOrReturn(CheckValueAsString(
                    "affiliateCallSign", ((MTRChannelClusterChannelInfo *) actualValue[3]).affiliateCallSign, @"KCTS"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeChannelLineup_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLineupWithCompletion:^(MTRChannelClusterLineupInfo * _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", ((MTRChannelClusterLineupInfo *) actualValue).operatorName, @"Comcast"));
                VerifyOrReturn(CheckValueAsString(
                    "lineupName", ((MTRChannelClusterLineupInfo *) actualValue).lineupName, @"Comcast King County"));
                VerifyOrReturn(
                    CheckValueAsString("postalCode", ((MTRChannelClusterLineupInfo *) actualValue).postalCode, @"98052"));
                VerifyOrReturn(CheckValue("lineupInfoType", ((MTRChannelClusterLineupInfo *) actualValue).lineupInfoType, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeCurrentChannel_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentChannelWithCompletion:^(
            MTRChannelClusterChannelInfo * _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", ((MTRChannelClusterChannelInfo *) actualValue).majorNumber, 6U));
                VerifyOrReturn(CheckValue("minorNumber", ((MTRChannelClusterChannelInfo *) actualValue).minorNumber, 0U));
                VerifyOrReturn(CheckValueAsString("name", ((MTRChannelClusterChannelInfo *) actualValue).name, @"ABC"));
                VerifyOrReturn(CheckValueAsString("callSign", ((MTRChannelClusterChannelInfo *) actualValue).callSign, @"KAAL-TV"));
                VerifyOrReturn(CheckValueAsString(
                    "affiliateCallSign", ((MTRChannelClusterChannelInfo *) actualValue).affiliateCallSign, @"KAAL"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestChangeChannelCommand_4()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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 = [[MTRContentLauncherClusterContentSearch alloc] init];
        {
            NSMutableArray * temp_1 = [[NSMutableArray alloc] init];
            temp_1[0] = [[MTRContentLauncherClusterParameter alloc] init];
            ((MTRContentLauncherClusterParameter *) temp_1[0]).type = [NSNumber numberWithUnsignedChar:1U];
            ((MTRContentLauncherClusterParameter *) temp_1[0]).value = @"exampleValue";
            {
                NSMutableArray * temp_4 = [[NSMutableArray alloc] init];
                temp_4[0] = [[MTRContentLauncherClusterAdditionalInfo alloc] init];
                ((MTRContentLauncherClusterAdditionalInfo *) temp_4[0]).name = @"name";
                ((MTRContentLauncherClusterAdditionalInfo *) temp_4[0]).value = @"value";

                ((MTRContentLauncherClusterParameter *) temp_1[0]).externalIDList = temp_4;
            }

            ((MTRContentLauncherClusterContentSearch *) params.search).parameterList = temp_1;
        }

        params.autoPlay = [NSNumber numberWithBool:true];
        params.data = @"exampleData";
        [cluster
            launchContentWithParams:params
                         completion:^(MTRContentLauncherClusterLaunchResponseParams * _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");
        __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 = [[MTRContentLauncherClusterBrandingInformation alloc] init];
        ((MTRContentLauncherClusterBrandingInformation *) params.brandingInformation).providerName = @"exampleName";
        ((MTRContentLauncherClusterBrandingInformation *) params.brandingInformation).background =
            [[MTRContentLauncherClusterStyleInformation alloc] init];
        ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *) params.brandingInformation)
                .background)
            .imageUrl
            = @"exampleUrl";
        ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *) params.brandingInformation)
                .background)
            .color
            = @"exampleColor";
        ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *) params.brandingInformation)
                .background)
            .size
            = [[MTRContentLauncherClusterDimension alloc] init];
        ((MTRContentLauncherClusterDimension *) ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *)
                                                                                                    params.brandingInformation)
                                                     .background)
                .size)
            .width
            = [NSNumber numberWithDouble:0];
        ((MTRContentLauncherClusterDimension *) ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *)
                                                                                                    params.brandingInformation)
                                                     .background)
                .size)
            .height
            = [NSNumber numberWithDouble:0];
        ((MTRContentLauncherClusterDimension *) ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *)
                                                                                                    params.brandingInformation)
                                                     .background)
                .size)
            .metric
            = [NSNumber numberWithUnsignedChar:0U];

        ((MTRContentLauncherClusterBrandingInformation *) params.brandingInformation).logo =
            [[MTRContentLauncherClusterStyleInformation alloc] init];
        ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *) params.brandingInformation)
                .logo)
            .imageUrl
            = @"exampleUrl";
        ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *) params.brandingInformation)
                .logo)
            .color
            = @"exampleColor";
        ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *) params.brandingInformation)
                .logo)
            .size
            = [[MTRContentLauncherClusterDimension alloc] init];
        ((MTRContentLauncherClusterDimension *) ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *)
                                                                                                    params.brandingInformation)
                                                     .logo)
                .size)
            .width
            = [NSNumber numberWithDouble:0];
        ((MTRContentLauncherClusterDimension *) ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *)
                                                                                                    params.brandingInformation)
                                                     .logo)
                .size)
            .height
            = [NSNumber numberWithDouble:0];
        ((MTRContentLauncherClusterDimension *) ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *)
                                                                                                    params.brandingInformation)
                                                     .logo)
                .size)
            .metric
            = [NSNumber numberWithUnsignedChar:0U];

        ((MTRContentLauncherClusterBrandingInformation *) params.brandingInformation).progressBar =
            [[MTRContentLauncherClusterStyleInformation alloc] init];
        ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *) params.brandingInformation)
                .progressBar)
            .imageUrl
            = @"exampleUrl";
        ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *) params.brandingInformation)
                .progressBar)
            .color
            = @"exampleColor";
        ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *) params.brandingInformation)
                .progressBar)
            .size
            = [[MTRContentLauncherClusterDimension alloc] init];
        ((MTRContentLauncherClusterDimension *) ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *)
                                                                                                    params.brandingInformation)
                                                     .progressBar)
                .size)
            .width
            = [NSNumber numberWithDouble:0];
        ((MTRContentLauncherClusterDimension *) ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *)
                                                                                                    params.brandingInformation)
                                                     .progressBar)
                .size)
            .height
            = [NSNumber numberWithDouble:0];
        ((MTRContentLauncherClusterDimension *) ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *)
                                                                                                    params.brandingInformation)
                                                     .progressBar)
                .size)
            .metric
            = [NSNumber numberWithUnsignedChar:0U];

        ((MTRContentLauncherClusterBrandingInformation *) params.brandingInformation).splash =
            [[MTRContentLauncherClusterStyleInformation alloc] init];
        ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *) params.brandingInformation)
                .splash)
            .imageUrl
            = @"exampleUrl";
        ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *) params.brandingInformation)
                .splash)
            .color
            = @"exampleColor";
        ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *) params.brandingInformation)
                .splash)
            .size
            = [[MTRContentLauncherClusterDimension alloc] init];
        ((MTRContentLauncherClusterDimension *) ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *)
                                                                                                    params.brandingInformation)
                                                     .splash)
                .size)
            .width
            = [NSNumber numberWithDouble:0];
        ((MTRContentLauncherClusterDimension *) ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *)
                                                                                                    params.brandingInformation)
                                                     .splash)
                .size)
            .height
            = [NSNumber numberWithDouble:0];
        ((MTRContentLauncherClusterDimension *) ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *)
                                                                                                    params.brandingInformation)
                                                     .splash)
                .size)
            .metric
            = [NSNumber numberWithUnsignedChar:0U];

        ((MTRContentLauncherClusterBrandingInformation *) params.brandingInformation).waterMark =
            [[MTRContentLauncherClusterStyleInformation alloc] init];
        ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *) params.brandingInformation)
                .waterMark)
            .imageUrl
            = @"exampleUrl";
        ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *) params.brandingInformation)
                .waterMark)
            .color
            = @"exampleColor";
        ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *) params.brandingInformation)
                .waterMark)
            .size
            = [[MTRContentLauncherClusterDimension alloc] init];
        ((MTRContentLauncherClusterDimension *) ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *)
                                                                                                    params.brandingInformation)
                                                     .waterMark)
                .size)
            .width
            = [NSNumber numberWithDouble:0];
        ((MTRContentLauncherClusterDimension *) ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *)
                                                                                                    params.brandingInformation)
                                                     .waterMark)
                .size)
            .height
            = [NSNumber numberWithDouble:0];
        ((MTRContentLauncherClusterDimension *) ((MTRContentLauncherClusterStyleInformation *) ((MTRContentLauncherClusterBrandingInformation *)
                                                                                                    params.brandingInformation)
                                                     .waterMark)
                .size)
            .metric
            = [NSNumber numberWithUnsignedChar:0U];

        [cluster launchURLWithParams:params
                          completion:^(MTRContentLauncherClusterLaunchResponseParams * _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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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", ((MTRMediaInputClusterInputInfo *) actualValue[0]).index, 1U));
                VerifyOrReturn(CheckValue("inputType", ((MTRMediaInputClusterInputInfo *) actualValue[0]).inputType, 4U));
                VerifyOrReturn(CheckValueAsString("name", ((MTRMediaInputClusterInputInfo *) actualValue[0]).name, @"HDMI"));
                VerifyOrReturn(CheckValueAsString("description",
                    ((MTRMediaInputClusterInputInfo *) actualValue[0]).descriptionString, @"High-Definition Multimedia Interface"));
                VerifyOrReturn(CheckValue("index", ((MTRMediaInputClusterInputInfo *) actualValue[1]).index, 2U));
                VerifyOrReturn(CheckValue("inputType", ((MTRMediaInputClusterInputInfo *) actualValue[1]).inputType, 4U));
                VerifyOrReturn(CheckValueAsString("name", ((MTRMediaInputClusterInputInfo *) actualValue[1]).name, @"HDMI"));
                VerifyOrReturn(CheckValueAsString("description",
                    ((MTRMediaInputClusterInputInfo *) actualValue[1]).descriptionString, @"High-Definition Multimedia Interface"));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadCurrentMediaInput_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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", ((MTRMediaInputClusterInputInfo *) actualValue[0]).index, 1U));
                VerifyOrReturn(CheckValue("inputType", ((MTRMediaInputClusterInputInfo *) actualValue[0]).inputType, 4U));
                VerifyOrReturn(CheckValueAsString("name", ((MTRMediaInputClusterInputInfo *) actualValue[0]).name, @"HDMI Test"));
                VerifyOrReturn(CheckValueAsString("description",
                    ((MTRMediaInputClusterInputInfo *) actualValue[0]).descriptionString, @"High-Definition Multimedia Interface"));
                VerifyOrReturn(CheckValue("index", ((MTRMediaInputClusterInputInfo *) actualValue[1]).index, 2U));
                VerifyOrReturn(CheckValue("inputType", ((MTRMediaInputClusterInputInfo *) actualValue[1]).inputType, 4U));
                VerifyOrReturn(CheckValueAsString("name", ((MTRMediaInputClusterInputInfo *) actualValue[1]).name, @"HDMI"));
                VerifyOrReturn(CheckValueAsString("description",
                    ((MTRMediaInputClusterInputInfo *) 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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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>(27)));
                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], 4294048774UL));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeClientList_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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",
                                                 ((MTROperationalCredentialsClusterFabricDescriptor *) actualValue[0]).label, @""));
                                             VerifyOrReturn(CheckValue("FabricIndex",
                                                 ((MTROperationalCredentialsClusterFabricDescriptor *) actualValue[0]).fabricIndex,
                                                 ourFabricIndex));
                                         }

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSetTheFabricLabel_6()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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");
        __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",
                                                 ((MTROperationalCredentialsClusterFabricDescriptor *) actualValue[0]).label,
                                                 @"Batcave"));
                                             VerifyOrReturn(CheckValue("FabricIndex",
                                                 ((MTROperationalCredentialsClusterFabricDescriptor *) 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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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",
                    ((MTRModeSelectClusterSemanticTag *) ((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",
                    ((MTRModeSelectClusterSemanticTag *) ((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",
                    ((MTRModeSelectClusterSemanticTag *) ((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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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("label list", [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");
        __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");
        __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("label list", [actualValue count], static_cast<uint32_t>(0)));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteUserLabelList_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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");
        __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("label list", [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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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",
                                                 ((MTROperationalCredentialsClusterFabricDescriptor *) actualValue[0]).nodeId,
                                                 mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL));
                                             VerifyOrReturn(CheckValueAsString("Label",
                                                 ((MTROperationalCredentialsClusterFabricDescriptor *) actualValue[0]).label, @""));
                                         }

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

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestArmFailSafeOnTargetDeviceWithTimeout0_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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");
        __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");
        __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.rootCertificate = [[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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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("fan mode", actualValue, 3U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteFanModeSequence_3()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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");
        __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("fan mode sequence", actualValue, 5U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritePercentSetting_5()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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");
        __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("percent setting", actualValue));
                VerifyOrReturn(CheckValue("percent setting", actualValue, 84U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackSpeedSetting_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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("speed setting", actualValue));
                VerifyOrReturn(CheckValue("speed setting", actualValue, 84U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackSpeedCurrent_8()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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("speed current", actualValue, 84U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritePercentSetting_9()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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");
        __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("percent setting", actualValue));
                VerifyOrReturn(CheckValue("percent setting", actualValue, 84U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteSpeedSetting_11()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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");
        __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("speed setting", actualValue));
                VerifyOrReturn(CheckValue("speed setting", actualValue, 73U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackPercentSetting_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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("percent setting", actualValue));
                VerifyOrReturn(CheckValue("percent setting", actualValue, 73U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackPercentCurrent_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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("percent current", actualValue, 73U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteSpeedSetting_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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");
        __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("speed setting", actualValue));
                VerifyOrReturn(CheckValue("speed setting", actualValue, 73U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteFanMode_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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");
        __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("percent setting", actualValue));
                VerifyOrReturn(CheckValue("percent setting", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackPercentCurrent_19()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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("percent current", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackSpeedSetting_20()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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("speed setting", actualValue));
                VerifyOrReturn(CheckValue("speed setting", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackSpeedCurrent_21()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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("speed current", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteFanMode_22()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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");
        __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("percent setting", actualValue));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackSpeedSetting_24()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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("speed setting", 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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:112233ULL];
                ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:3U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:1U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) 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");
        __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] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:112233ULL];
                ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:3U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) 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");
        __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] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:112233ULL];
                ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:3U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:4U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) 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");
        __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] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:112233ULL];
                ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:3U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:0ULL];
                ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) 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");
        __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] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:112233ULL];
                ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:3U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:2U];
            ((MTRAccessControlClusterAccessControlEntry *) 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;

                ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).targets = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) 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");
        __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] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:112233ULL];
                ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:3U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:2U];
            ((MTRAccessControlClusterAccessControlEntry *) 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];

                ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).targets = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) 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");
        __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] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:112233ULL];
                ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:6U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:2U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).subjects = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) 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");
        __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] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:112233ULL];
                ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:3U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:18446744073709551615ULL];
                ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) 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");
        __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] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:112233ULL];
                ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:3U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:18446744060824649728ULL];
                ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) 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");
        __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] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).privilege = [NSNumber numberWithUnsignedChar:5U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:112233ULL];
                ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[1] = [[MTRAccessControlClusterAccessControlEntry alloc] init];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).privilege = [NSNumber numberWithUnsignedChar:3U];
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).authMode = [NSNumber numberWithUnsignedChar:2U];
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedLongLong:18446744073709486080ULL];
                ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).subjects = temp_3;
            }
            ((MTRAccessControlClusterAccessControlEntry *) temp_0[1]).targets = nil;
            ((MTRAccessControlClusterAccessControlEntry *) 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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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 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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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",
                                                 ((MTROperationalCredentialsClusterFabricDescriptor *) actualValue[0]).nodeId,
                                                 mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL));
                                         }

                                         NextTest();
                                     }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCloseCommissioningWindowAfterFailedCommissioning_7()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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 duplicate with bug workaround\n");
            err = TestReadingRfidCredentialWithIndex0ReturnsNoCredentialDuplicateWithBugWorkaround_53();
            break;
        case 54:
            ChipLogProgress(
                chipTool, " ***** Test Step 54 : Reading RFID credential with out-of-bounds index returns no credential\n");
            err = TestReadingRfidCredentialWithOutOfBoundsIndexReturnsNoCredential_54();
            break;
        case 55:
            ChipLogProgress(chipTool, " ***** Test Step 55 : Check that RFID credential does not exist\n");
            err = TestCheckThatRfidCredentialDoesNotExist_55();
            break;
        case 56:
            ChipLogProgress(chipTool, " ***** Test Step 56 : Create new RFID credential and add it to existing user\n");
            err = TestCreateNewRfidCredentialAndAddItToExistingUser_56();
            break;
        case 57:
            ChipLogProgress(chipTool, " ***** Test Step 57 : Verify modified user\n");
            err = TestVerifyModifiedUser_57();
            break;
        case 58:
            ChipLogProgress(chipTool, " ***** Test Step 58 : Verify created credential\n");
            err = TestVerifyCreatedCredential_58();
            break;
        case 59:
            ChipLogProgress(chipTool, " ***** Test Step 59 : Create new RFID credential and user with index 0 fails\n");
            err = TestCreateNewRfidCredentialAndUserWithIndex0Fails_59();
            break;
        case 60:
            ChipLogProgress(chipTool, " ***** Test Step 60 : Create new RFID credential and user with out-of-bounds index fails\n");
            err = TestCreateNewRfidCredentialAndUserWithOutOfBoundsIndexFails_60();
            break;
        case 61:
            ChipLogProgress(chipTool, " ***** Test Step 61 : Create new credential and try to add it to 0 user\n");
            err = TestCreateNewCredentialAndTryToAddItTo0User_61();
            break;
        case 62:
            ChipLogProgress(chipTool, " ***** Test Step 62 : Create new credential and try to add it to out-of-bounds user\n");
            err = TestCreateNewCredentialAndTryToAddItToOutOfBoundsUser_62();
            break;
        case 63:
            ChipLogProgress(chipTool, " ***** Test Step 63 : Create new PIN with too short data\n");
            err = TestCreateNewPinWithTooShortData_63();
            break;
        case 64:
            ChipLogProgress(chipTool, " ***** Test Step 64 : Create new PIN with too long data\n");
            err = TestCreateNewPinWithTooLongData_64();
            break;
        case 65:
            ChipLogProgress(chipTool, " ***** Test Step 65 : Create new RFID with too short data\n");
            err = TestCreateNewRfidWithTooShortData_65();
            break;
        case 66:
            ChipLogProgress(chipTool, " ***** Test Step 66 : Create new PIN with Programming user type fails\n");
            err = TestCreateNewPinWithProgrammingUserTypeFails_66();
            break;
        case 67:
            ChipLogProgress(chipTool, " ***** Test Step 67 : Create new RFID with too short data\n");
            err = TestCreateNewRfidWithTooShortData_67();
            break;
        case 68:
            ChipLogProgress(chipTool, " ***** Test Step 68 : Create new PIN credential with data the would cause duplicate\n");
            err = TestCreateNewPinCredentialWithDataTheWouldCauseDuplicate_68();
            break;
        case 69:
            ChipLogProgress(chipTool, " ***** Test Step 69 : Create new RFID credential with data the would cause duplicate\n");
            err = TestCreateNewRfidCredentialWithDataTheWouldCauseDuplicate_69();
            break;
        case 70:
            ChipLogProgress(chipTool, " ***** Test Step 70 : Modify credentialData of existing PIN credential\n");
            err = TestModifyCredentialDataOfExistingPinCredential_70();
            break;
        case 71:
            ChipLogProgress(
                chipTool, " ***** Test Step 71 : Verify that credential was changed by creating new credential with old data\n");
            err = TestVerifyThatCredentialWasChangedByCreatingNewCredentialWithOldData_71();
            break;
        case 72:
            ChipLogProgress(
                chipTool, " ***** Test Step 72 : Verify that credential was changed by creating new credential with new data\n");
            err = TestVerifyThatCredentialWasChangedByCreatingNewCredentialWithNewData_72();
            break;
        case 73:
            ChipLogProgress(chipTool, " ***** Test Step 73 : Create new RFID credential and add it to existing user\n");
            err = TestCreateNewRfidCredentialAndAddItToExistingUser_73();
            break;
        case 74:
            ChipLogProgress(chipTool, " ***** Test Step 74 : Verify modified user\n");
            err = TestVerifyModifiedUser_74();
            break;
        case 75:
            ChipLogProgress(chipTool, " ***** Test Step 75 : Create new RFID credential and add it to existing user\n");
            err = TestCreateNewRfidCredentialAndAddItToExistingUser_75();
            break;
        case 76:
            ChipLogProgress(chipTool, " ***** Test Step 76 : Verify modified user\n");
            err = TestVerifyModifiedUser_76();
            break;
        case 77:
            ChipLogProgress(chipTool, " ***** Test Step 77 : Clear first PIN credential\n");
            err = TestClearFirstPinCredential_77();
            break;
        case 78:
            ChipLogProgress(chipTool, " ***** Test Step 78 : Read back the credential and make sure it is deleted\n");
            err = TestReadBackTheCredentialAndMakeSureItIsDeleted_78();
            break;
        case 79:
            ChipLogProgress(chipTool, " ***** Test Step 79 : Read the user back and make sure PIN credential is deleted\n");
            err = TestReadTheUserBackAndMakeSurePinCredentialIsDeleted_79();
            break;
        case 80:
            ChipLogProgress(chipTool, " ***** Test Step 80 : Clear the second PIN credential\n");
            err = TestClearTheSecondPinCredential_80();
            break;
        case 81:
            ChipLogProgress(chipTool, " ***** Test Step 81 : Read back the credential and make sure it is deleted\n");
            err = TestReadBackTheCredentialAndMakeSureItIsDeleted_81();
            break;
        case 82:
            ChipLogProgress(chipTool, " ***** Test Step 82 : Read the user back and make sure related user is deleted\n");
            err = TestReadTheUserBackAndMakeSureRelatedUserIsDeleted_82();
            break;
        case 83:
            ChipLogProgress(chipTool, " ***** Test Step 83 : Create new RFID credential with user\n");
            err = TestCreateNewRfidCredentialWithUser_83();
            break;
        case 84:
            ChipLogProgress(chipTool, " ***** Test Step 84 : Clear all the RFID credentials\n");
            err = TestClearAllTheRfidCredentials_84();
            break;
        case 85:
            ChipLogProgress(chipTool, " ***** Test Step 85 : Read back the fist RFID credential and make sure it is deleted\n");
            err = TestReadBackTheFistRfidCredentialAndMakeSureItIsDeleted_85();
            break;
        case 86:
            ChipLogProgress(chipTool, " ***** Test Step 86 : Read back the second RFID credential and make sure it is deleted\n");
            err = TestReadBackTheSecondRfidCredentialAndMakeSureItIsDeleted_86();
            break;
        case 87:
            ChipLogProgress(chipTool, " ***** Test Step 87 : Read back the third RFID credential and make sure it is deleted\n");
            err = TestReadBackTheThirdRfidCredentialAndMakeSureItIsDeleted_87();
            break;
        case 88:
            ChipLogProgress(chipTool,
                " ***** Test Step 88 : Read the user related with first RFID back and make sure it has only PIN credential\n");
            err = TestReadTheUserRelatedWithFirstRfidBackAndMakeSureItHasOnlyPinCredential_88();
            break;
        case 89:
            ChipLogProgress(
                chipTool, " ***** Test Step 89 : Read the user related with second RFID back and make sure it is deleted\n");
            err = TestReadTheUserRelatedWithSecondRfidBackAndMakeSureItIsDeleted_89();
            break;
        case 90:
            ChipLogProgress(chipTool, " ***** Test Step 90 : Create new PIN credential with user\n");
            err = TestCreateNewPinCredentialWithUser_90();
            break;
        case 91:
            ChipLogProgress(chipTool, " ***** Test Step 91 : Create new RFID credential with user\n");
            err = TestCreateNewRfidCredentialWithUser_91();
            break;
        case 92:
            ChipLogProgress(chipTool, " ***** Test Step 92 : Create another RFID credential with user\n");
            err = TestCreateAnotherRfidCredentialWithUser_92();
            break;
        case 93:
            ChipLogProgress(chipTool, " ***** Test Step 93 : Clear all the credentials\n");
            err = TestClearAllTheCredentials_93();
            break;
        case 94:
            ChipLogProgress(chipTool, " ***** Test Step 94 : Read back the first PIN credential and make sure it is deleted\n");
            err = TestReadBackTheFirstPinCredentialAndMakeSureItIsDeleted_94();
            break;
        case 95:
            ChipLogProgress(chipTool, " ***** Test Step 95 : Read back the first RFID credential and make sure it is deleted\n");
            err = TestReadBackTheFirstRfidCredentialAndMakeSureItIsDeleted_95();
            break;
        case 96:
            ChipLogProgress(chipTool, " ***** Test Step 96 : Read back the second PIN credential and make sure it is deleted\n");
            err = TestReadBackTheSecondPinCredentialAndMakeSureItIsDeleted_96();
            break;
        case 97:
            ChipLogProgress(
                chipTool, " ***** Test Step 97 : Read the user related with first PIN back and make sure it is deleted\n");
            err = TestReadTheUserRelatedWithFirstPinBackAndMakeSureItIsDeleted_97();
            break;
        case 98:
            ChipLogProgress(
                chipTool, " ***** Test Step 98 : Read the user related with first RFID back and make sure it is deleted\n");
            err = TestReadTheUserRelatedWithFirstRfidBackAndMakeSureItIsDeleted_98();
            break;
        case 99:
            ChipLogProgress(
                chipTool, " ***** Test Step 99 : Read the user related with second PIN back and make sure it is deleted\n");
            err = TestReadTheUserRelatedWithSecondPinBackAndMakeSureItIsDeleted_99();
            break;
        case 100:
            ChipLogProgress(
                chipTool, " ***** Test Step 100 : Read the user related with last RFID back and make sure it is deleted\n");
            err = TestReadTheUserRelatedWithLastRfidBackAndMakeSureItIsDeleted_100();
            break;
        case 101:
            ChipLogProgress(chipTool, " ***** Test Step 101 : Create new Programming PIN credential with invalid index\n");
            err = TestCreateNewProgrammingPinCredentialWithInvalidIndex_101();
            break;
        case 102:
            ChipLogProgress(chipTool, " ***** Test Step 102 : Create new Programming PIN credential with valid index\n");
            err = TestCreateNewProgrammingPinCredentialWithValidIndex_102();
            break;
        case 103:
            ChipLogProgress(chipTool, " ***** Test Step 103 : Verify created user\n");
            err = TestVerifyCreatedUser_103();
            break;
        case 104:
            ChipLogProgress(chipTool, " ***** Test Step 104 : Verify created programming PIN credential\n");
            err = TestVerifyCreatedProgrammingPinCredential_104();
            break;
        case 105:
            ChipLogProgress(chipTool, " ***** Test Step 105 : Modify the Programming PIN credential\n");
            err = TestModifyTheProgrammingPinCredential_105();
            break;
        case 106:
            ChipLogProgress(chipTool, " ***** Test Step 106 : Clearing Programming PIN fails\n");
            err = TestClearingProgrammingPinFails_106();
            break;
        case 107:
            ChipLogProgress(chipTool, " ***** Test Step 107 : Clearing Programming PIN with invalid index fails\n");
            err = TestClearingProgrammingPinWithInvalidIndexFails_107();
            break;
        case 108:
            ChipLogProgress(chipTool, " ***** Test Step 108 : Clearing PIN credential with zero index fails\n");
            err = TestClearingPinCredentialWithZeroIndexFails_108();
            break;
        case 109:
            ChipLogProgress(chipTool, " ***** Test Step 109 : Clearing PIN credential with out-of-bound index fails\n");
            err = TestClearingPinCredentialWithOutOfBoundIndexFails_109();
            break;
        case 110:
            ChipLogProgress(chipTool, " ***** Test Step 110 : Clearing RFID credential with zero index fails\n");
            err = TestClearingRfidCredentialWithZeroIndexFails_110();
            break;
        case 111:
            ChipLogProgress(chipTool, " ***** Test Step 111 : Clearing RFID credential with out-of-bound index fails\n");
            err = TestClearingRfidCredentialWithOutOfBoundIndexFails_111();
            break;
        case 112:
            ChipLogProgress(chipTool, " ***** Test Step 112 : Clear the Programming PIN user\n");
            err = TestClearTheProgrammingPinUser_112();
            break;
        case 113:
            ChipLogProgress(chipTool, " ***** Test Step 113 : Make sure Programming PIN user is deleted\n");
            err = TestMakeSureProgrammingPinUserIsDeleted_113();
            break;
        case 114:
            ChipLogProgress(chipTool, " ***** Test Step 114 : Make sure programming PIN credential is deleted\n");
            err = TestMakeSureProgrammingPinCredentialIsDeleted_114();
            break;
        case 115:
            ChipLogProgress(chipTool, " ***** Test Step 115 : Create new PIN credential and user\n");
            err = TestCreateNewPinCredentialAndUser_115();
            break;
        case 116:
            ChipLogProgress(chipTool, " ***** Test Step 116 : Create second PIN credential and add it to existing user\n");
            err = TestCreateSecondPinCredentialAndAddItToExistingUser_116();
            break;
        case 117:
            ChipLogProgress(chipTool, " ***** Test Step 117 : Create third PIN credential and add it to existing user\n");
            err = TestCreateThirdPinCredentialAndAddItToExistingUser_117();
            break;
        case 118:
            ChipLogProgress(chipTool, " ***** Test Step 118 : Create fourth PIN credential and add it to existing user\n");
            err = TestCreateFourthPinCredentialAndAddItToExistingUser_118();
            break;
        case 119:
            ChipLogProgress(chipTool, " ***** Test Step 119 : Create fifth PIN credential and add it to existing user\n");
            err = TestCreateFifthPinCredentialAndAddItToExistingUser_119();
            break;
        case 120:
            ChipLogProgress(chipTool, " ***** Test Step 120 : Try to create sixth PIN credential and make sure it fails\n");
            err = TestTryToCreateSixthPinCredentialAndMakeSureItFails_120();
            break;
        case 121:
            ChipLogProgress(chipTool, " ***** Test Step 121 : Final clean-up\n");
            err = TestFinalCleanUp_121();
            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), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 107:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 108:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 109:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 110:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 111:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 112:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 113:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        }

        // 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 = 122;

    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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) 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");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) 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");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) 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");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) 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");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) 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");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) 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");
        __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", ((MTRDoorLockClusterDlCredential *) actualValue[0]).credentialType, 1U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialIndex", ((MTRDoorLockClusterDlCredential *) 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");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) 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");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) 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");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) 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");
        __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 TestReadingRfidCredentialWithIndex0ReturnsNoCredentialDuplicateWithBugWorkaround_53()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterDlCredential *) 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_54()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterDlCredential *) 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_55()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterDlCredential *) 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_56()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:2U];

        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, 3U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyModifiedUser_57()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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", ((MTRDoorLockClusterDlCredential *) actualValue[0]).credentialType, 1U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialIndex", ((MTRDoorLockClusterDlCredential *) actualValue[0]).credentialIndex, 1U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialType", ((MTRDoorLockClusterDlCredential *) actualValue[1]).credentialType, 2U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialIndex", ((MTRDoorLockClusterDlCredential *) actualValue[1]).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(CheckValueNull("nextUserIndex", actualValue));
                            }

                            NextTest();
                        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyCreatedCredential_58()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:2U];

        [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_59()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterDlCredential *) 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, 3U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewRfidCredentialAndUserWithOutOfBoundsIndexFails_60()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterDlCredential *) 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_61()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:3U];

        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, 4U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewCredentialAndTryToAddItToOutOfBoundsUser_62()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:3U];

        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, 4U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewPinWithTooShortData_63()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:3U];

        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, 4U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewPinWithTooLongData_64()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:3U];

        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, 4U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewRfidWithTooShortData_65()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:3U];

        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, 4U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewPinWithProgrammingUserTypeFails_66()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:3U];

        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, 4U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewRfidWithTooShortData_67()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:3U];

        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, 4U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewPinCredentialWithDataTheWouldCauseDuplicate_68()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:4U];

        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, 5U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewRfidCredentialWithDataTheWouldCauseDuplicate_69()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:4U];

        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, 5U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestModifyCredentialDataOfExistingPinCredential_70()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) 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, 3U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatCredentialWasChangedByCreatingNewCredentialWithOldData_71()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) 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(@"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, 4U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyThatCredentialWasChangedByCreatingNewCredentialWithNewData_72()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:4U];

        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, 5U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateNewRfidCredentialAndAddItToExistingUser_73()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:4U];

        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, 5U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyModifiedUser_74()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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", ((MTRDoorLockClusterDlCredential *) actualValue[0]).credentialType, 1U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialIndex", ((MTRDoorLockClusterDlCredential *) actualValue[0]).credentialIndex, 1U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialType", ((MTRDoorLockClusterDlCredential *) actualValue[1]).credentialType, 2U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialIndex", ((MTRDoorLockClusterDlCredential *) actualValue[1]).credentialIndex, 2U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialType", ((MTRDoorLockClusterDlCredential *) actualValue[2]).credentialType, 2U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialIndex", ((MTRDoorLockClusterDlCredential *) actualValue[2]).credentialIndex, 4U));
                            }

                            {
                                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_75()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:5U];

        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, 6U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestVerifyModifiedUser_76()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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", ((MTRDoorLockClusterDlCredential *) actualValue[0]).credentialType, 1U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialIndex", ((MTRDoorLockClusterDlCredential *) actualValue[0]).credentialIndex, 1U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialType", ((MTRDoorLockClusterDlCredential *) actualValue[1]).credentialType, 2U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialIndex", ((MTRDoorLockClusterDlCredential *) actualValue[1]).credentialIndex, 2U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialType", ((MTRDoorLockClusterDlCredential *) actualValue[2]).credentialType, 2U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialIndex", ((MTRDoorLockClusterDlCredential *) actualValue[2]).credentialIndex, 4U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialType", ((MTRDoorLockClusterDlCredential *) actualValue[3]).credentialType, 1U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialIndex", ((MTRDoorLockClusterDlCredential *) actualValue[3]).credentialIndex, 5U));
                            }

                            {
                                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_77()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) 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_78()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) 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_79()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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", ((MTRDoorLockClusterDlCredential *) actualValue[0]).credentialType, 2U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialIndex", ((MTRDoorLockClusterDlCredential *) actualValue[0]).credentialIndex, 2U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialType", ((MTRDoorLockClusterDlCredential *) actualValue[1]).credentialType, 2U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialIndex", ((MTRDoorLockClusterDlCredential *) actualValue[1]).credentialIndex, 4U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialType", ((MTRDoorLockClusterDlCredential *) actualValue[2]).credentialType, 1U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialIndex", ((MTRDoorLockClusterDlCredential *) actualValue[2]).credentialIndex, 5U));
                            }

                            {
                                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_80()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:3U];

        [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_81()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:3U];

        [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, 4U));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheUserBackAndMakeSureRelatedUserIsDeleted_82()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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_83()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:1U];

        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, 3U));
                             }

                             NextTest();
                         }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearAllTheRfidCredentials_84()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterDlCredential *) 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_85()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterDlCredential *) 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(CheckValueNonNull("nextCredentialIndex", actualValue));
                                            VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 5U));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackTheSecondRfidCredentialAndMakeSureItIsDeleted_86()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterDlCredential *) 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(CheckValueNonNull("nextCredentialIndex", actualValue));
                                            VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 5U));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadBackTheThirdRfidCredentialAndMakeSureItIsDeleted_87()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialIndex = [NSNumber numberWithUnsignedShort:4U];

        [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(CheckValueNonNull("nextCredentialIndex", actualValue));
                                            VerifyOrReturn(CheckValue("nextCredentialIndex", actualValue, 5U));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheUserRelatedWithFirstRfidBackAndMakeSureItHasOnlyPinCredential_88()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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", ((MTRDoorLockClusterDlCredential *) actualValue[0]).credentialType, 1U));
                           VerifyOrReturn(CheckValue(
                               "CredentialIndex", ((MTRDoorLockClusterDlCredential *) actualValue[0]).credentialIndex, 5U));
                       }

                       {
                           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_89()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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_90()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) 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_91()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterDlCredential *) 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_92()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterDlCredential *) 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_93()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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_94()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) 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_95()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterDlCredential *) 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_96()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) 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_97()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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_98()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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_99()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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_100()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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_101()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:0U];
        ((MTRDoorLockClusterDlCredential *) 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_102()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:0U];
        ((MTRDoorLockClusterDlCredential *) 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_103()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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", ((MTRDoorLockClusterDlCredential *) actualValue[0]).credentialType, 0U));
                                VerifyOrReturn(CheckValue(
                                    "CredentialIndex", ((MTRDoorLockClusterDlCredential *) 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_104()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:0U];
        ((MTRDoorLockClusterDlCredential *) 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_105()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:0U];
        ((MTRDoorLockClusterDlCredential *) 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_106()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:0U];
        ((MTRDoorLockClusterDlCredential *) 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_107()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:0U];
        ((MTRDoorLockClusterDlCredential *) 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_108()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) 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_109()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) 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_110()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterDlCredential *) 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_111()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:2U];
        ((MTRDoorLockClusterDlCredential *) 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_112()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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_113()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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_114()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:0U];
        ((MTRDoorLockClusterDlCredential *) 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_115()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) 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_116()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) 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_117()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) 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_118()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) 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_119()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) 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_120()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) 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_121()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) 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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) 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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) 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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) 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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) 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");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) 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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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));

            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");
        __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");
        __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");
        __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));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestThWritesUserCodeTemporaryDisableTimeAttributeValueAsBetween1And255OnTheDutAndVerifyThatTheDutSendsSuccessResponse_23()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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");
        __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");
        __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");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) 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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) 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");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) 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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) 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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) 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");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) 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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) 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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) 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");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) 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");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) 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");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) 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");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) 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");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) 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");
        __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");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) 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");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) 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");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) 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");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:1U];
        ((MTRDoorLockClusterDlCredential *) 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");
        __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 = [[MTRDoorLockClusterDlCredential alloc] init];
        ((MTRDoorLockClusterDlCredential *) params.credential).credentialType = [NSNumber numberWithUnsignedChar:8U];
        ((MTRDoorLockClusterDlCredential *) 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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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 : Read GroupTable\n");
            err = TestReadGroupTable_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : KeySet Remove 1\n");
            err = TestKeySetRemove1_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : KeySet Read (removed)\n");
            err = TestKeySetReadRemoved_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : KeySet Read (not removed)\n");
            err = TestKeySetReadNotRemoved_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Remove Group 1\n");
            err = TestRemoveGroup1_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Read GroupTable 2\n");
            err = TestReadGroupTable2_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Remove All\n");
            err = TestRemoveAll_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Read GroupTable 3\n");
            err = TestReadGroupTable3_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : KeySet Remove 2\n");
            err = TestKeySetRemove2_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : KeySet Read (also removed)\n");
            err = TestKeySetReadAlsoRemoved_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), 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), EMBER_ZCL_STATUS_NOT_FOUND));
            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), EMBER_ZCL_STATUS_NOT_FOUND));
            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 TestReadMaxGroupsPerFabric_1()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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], 2U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadMaxGroupKeysPerFabric_2()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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];

            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");
        __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];

            temp_0[2] = [[MTRGroupKeyManagementClusterGroupKeyMapStruct alloc] init];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[2]).groupId = [NSNumber numberWithUnsignedShort:258U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[2]).groupKeySetID = [NSNumber numberWithUnsignedShort:418U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[2]).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");
        __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>(3)));
                                            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,
                                                417U));
                                            VerifyOrReturn(CheckValue("FabricIndex",
                                                ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) actualValue[1]).fabricIndex,
                                                1U));
                                            VerifyOrReturn(CheckValue("GroupId",
                                                ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) actualValue[2]).groupId, 258U));
                                            VerifyOrReturn(CheckValue("GroupKeySetID",
                                                ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) actualValue[2]).groupKeySetID,
                                                418U));
                                            VerifyOrReturn(CheckValue("FabricIndex",
                                                ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) actualValue[2]).fabricIndex,
                                                1U));
                                        }

                                        NextTest();
                                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestAddGroup1_10()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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");
        __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 TestReadGroupTable_12()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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>(2)));
                                           VerifyOrReturn(CheckValue("GroupId",
                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[0]).groupId, 257U));
                                           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(CheckValueAsString("GroupName",
                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[1]).groupName,
                                               @"Group #2"));
                                           VerifyOrReturn(CheckValue("FabricIndex",
                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[1]).fabricIndex,
                                               1U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestKeySetRemove1_13()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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_14()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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_15()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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_16()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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_17()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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>(1)));
                                           VerifyOrReturn(CheckValue("GroupId",
                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[0]).groupId, 258U));
                                           VerifyOrReturn(CheckValueAsString("GroupName",
                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[0]).groupName,
                                               @"Group #2"));
                                           VerifyOrReturn(CheckValue("FabricIndex",
                                               ((MTRGroupKeyManagementClusterGroupInfoMapStruct *) actualValue[0]).fabricIndex,
                                               1U));
                                       }

                                       NextTest();
                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestRemoveAll_18()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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_19()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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_20()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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_21()
    {

        MTRBaseDevice * device = GetDevice("alpha");
        __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;
    }
};

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() {}

    /////////// TestCommand Interface /////////
    void NextTest() override
    {
        CHIP_ERROR err = CHIP_NO_ERROR;

        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");
        __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");
        __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");
        __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");
        __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");
        __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");
        __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_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_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<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);
}
