/*
 *
 *    Copyright (c) 2022 Project CHIP Authors
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */

// THIS FILE IS GENERATED BY ZAP

#pragma once

#if CONFIG_ENABLE_YAML_TESTS

#include <commands/tests/TestCommandBridge.h>
#include <lib/core/Optional.h>
#include <system/SystemClock.h>

#include <math.h> // For INFINITY

class TestList : public Command {
public:
    TestList()
        : Command("list") {};
    CHIP_ERROR Run() override
    {
        printf("TestAccessControlCluster\n");
        printf("Test_TC_BOOL_1_1\n");
        printf("Test_TC_BOOL_2_1\n");
        printf("Test_TC_ACT_1_1\n");
        printf("Test_TC_CC_1_1\n");
        printf("Test_TC_CC_2_1\n");
        printf("Test_TC_CC_3_2\n");
        printf("Test_TC_CC_3_3\n");
        printf("Test_TC_CC_4_1\n");
        printf("Test_TC_CC_4_2\n");
        printf("Test_TC_CC_4_3\n");
        printf("Test_TC_CC_4_4\n");
        printf("Test_TC_CC_5_1\n");
        printf("Test_TC_CC_5_2\n");
        printf("Test_TC_CC_5_3\n");
        printf("Test_TC_CC_6_1\n");
        printf("Test_TC_CC_6_2\n");
        printf("Test_TC_CC_6_3\n");
        printf("Test_TC_CC_7_3\n");
        printf("Test_TC_CC_7_4\n");
        printf("Test_TC_CC_8_1\n");
        printf("Test_TC_BINFO_1_1\n");
        printf("Test_TC_CNET_1_3\n");
        printf("Test_TC_DESC_1_1\n");
        printf("Test_TC_DGETH_2_1\n");
        printf("Test_TC_DGETH_2_2\n");
        printf("Test_TC_FLW_1_1\n");
        printf("Test_TC_FLW_2_1\n");
        printf("Test_TC_CGEN_1_1\n");
        printf("Test_TC_CGEN_2_1\n");
        printf("Test_TC_DGGEN_1_1\n");
        printf("Test_TC_DGGEN_2_1\n");
        printf("Test_TC_I_1_1\n");
        printf("Test_TC_I_2_1\n");
        printf("Test_TC_I_2_2\n");
        printf("Test_TC_I_2_3\n");
        printf("Test_TC_ILL_1_1\n");
        printf("Test_TC_ILL_2_1\n");
        printf("Test_TC_LVL_1_1\n");
        printf("Test_TC_LVL_2_1\n");
        printf("Test_TC_LVL_2_2\n");
        printf("Test_TC_LVL_3_1\n");
        printf("Test_TC_LVL_4_1\n");
        printf("Test_TC_LVL_5_1\n");
        printf("Test_TC_LVL_6_1\n");
        printf("Test_TC_LOWPOWER_1_1\n");
        printf("Test_TC_KEYPADINPUT_1_2\n");
        printf("Test_TC_APPLAUNCHER_1_3\n");
        printf("Test_TC_MEDIAINPUT_1_4\n");
        printf("Test_TC_WAKEONLAN_1_5\n");
        printf("Test_TC_CHANNEL_1_6\n");
        printf("Test_TC_MEDIAPLAYBACK_1_7\n");
        printf("Test_TC_AUDIOOUTPUT_1_8\n");
        printf("Test_TC_TGTNAV_1_9\n");
        printf("Test_TC_TGTNAV_8_2\n");
        printf("Test_TC_APBSC_1_10\n");
        printf("Test_TC_CONTENTLAUNCHER_1_11\n");
        printf("Test_TC_ALOGIN_1_12\n");
        printf("Test_TC_LOWPOWER_2_1\n");
        printf("Test_TC_KEYPADINPUT_3_2\n");
        printf("Test_TC_KEYPADINPUT_3_3\n");
        printf("Test_TC_APPLAUNCHER_3_5\n");
        printf("Test_TC_APPLAUNCHER_3_6\n");
        printf("Test_TC_MEDIAINPUT_3_10\n");
        printf("Test_TC_MEDIAINPUT_3_11\n");
        printf("Test_TC_MEDIAINPUT_3_12\n");
        printf("Test_TC_MEDIAINPUT_3_13\n");
        printf("Test_TC_CHANNEL_5_1\n");
        printf("Test_TC_CHANNEL_5_2\n");
        printf("Test_TC_CHANNEL_5_3\n");
        printf("Test_TC_MEDIAPLAYBACK_6_1\n");
        printf("Test_TC_MEDIAPLAYBACK_6_2\n");
        printf("Test_TC_MEDIAPLAYBACK_6_3\n");
        printf("Test_TC_MEDIAPLAYBACK_6_4\n");
        printf("Test_TC_AUDIOOUTPUT_7_1\n");
        printf("Test_TC_AUDIOOUTPUT_7_2\n");
        printf("Test_TC_TGTNAV_8_1\n");
        printf("Test_TC_APBSC_9_1\n");
        printf("Test_TC_CONTENTLAUNCHER_10_1\n");
        printf("Test_TC_MOD_1_1\n");
        printf("OTA_SuccessfulTransfer\n");
        printf("Test_TC_OCC_1_1\n");
        printf("Test_TC_OCC_2_1\n");
        printf("Test_TC_OO_1_1\n");
        printf("Test_TC_OO_2_1\n");
        printf("Test_TC_OO_2_2\n");
        printf("Test_TC_OO_2_4\n");
        printf("Test_TC_PS_1_1\n");
        printf("Test_TC_PS_2_1\n");
        printf("Test_TC_PRS_1_1\n");
        printf("Test_TC_PRS_2_1\n");
        printf("Test_TC_PCC_1_1\n");
        printf("Test_TC_PCC_2_1\n");
        printf("Test_TC_PCC_2_2\n");
        printf("Test_TC_PCC_2_3\n");
        printf("Test_TC_PCC_2_4\n");
        printf("Test_TC_PSCFG_1_1\n");
        printf("Test_TC_RH_1_1\n");
        printf("Test_TC_RH_2_1\n");
        printf("Test_TC_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_TSTAT_2_1\n");
        printf("Test_TC_TSTAT_2_2\n");
        printf("Test_TC_TSUIC_1_1\n");
        printf("Test_TC_TSUIC_2_1\n");
        printf("Test_TC_TSUIC_2_2\n");
        printf("Test_TC_ULABEL_1_1\n");
        printf("Test_TC_ULABEL_2_2\n");
        printf("Test_TC_ULABEL_2_3\n");
        printf("Test_TC_ULABEL_2_4\n");
        printf("Test_TC_DGWIFI_2_1\n");
        printf("Test_TC_DGWIFI_2_3\n");
        printf("Test_TC_WNCV_1_1\n");
        printf("Test_TC_WNCV_2_1\n");
        printf("Test_TC_WNCV_2_2\n");
        printf("Test_TC_WNCV_2_3\n");
        printf("Test_TC_WNCV_2_4\n");
        printf("Test_TC_WNCV_2_5\n");
        printf("Test_TC_WNCV_3_1\n");
        printf("Test_TC_WNCV_3_2\n");
        printf("Test_TC_WNCV_3_3\n");
        printf("Test_TC_WNCV_3_4\n");
        printf("Test_TC_WNCV_3_5\n");
        printf("Test_TC_WNCV_4_1\n");
        printf("Test_TC_WNCV_4_2\n");
        printf("Test_TC_WNCV_4_3\n");
        printf("Test_TC_WNCV_4_4\n");
        printf("Test_TC_WNCV_4_5\n");
        printf("TV_TargetNavigatorCluster\n");
        printf("TV_AudioOutputCluster\n");
        printf("TV_ApplicationLauncherCluster\n");
        printf("TV_KeypadInputCluster\n");
        printf("TV_AccountLoginCluster\n");
        printf("TV_WakeOnLanCluster\n");
        printf("TV_ApplicationBasicCluster\n");
        printf("TV_MediaPlaybackCluster\n");
        printf("TV_ChannelCluster\n");
        printf("TV_LowPowerCluster\n");
        printf("TV_ContentLauncherCluster\n");
        printf("TV_MediaInputCluster\n");
        printf("TestCASERecovery\n");
        printf("TestCluster\n");
        printf("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_2_1\n");
        printf("Test_TC_DGSW_2_2\n");
        printf("Test_TC_DGSW_2_3\n");
        printf("TestSubscribe_OnOff\n");
        printf("DL_UsersAndCredentials\n");
        printf("DL_LockUnlock\n");
        printf("DL_Schedules\n");
        printf("Test_TC_DRLK_2_2\n");
        printf("Test_TC_DRLK_2_3\n");
        printf("Test_TC_DRLK_2_4\n");
        printf("Test_TC_DRLK_2_5\n");
        printf("Test_TC_DRLK_2_7\n");
        printf("Test_TC_DRLK_2_9\n");
        printf("TestGroupsCluster\n");
        printf("TestGroupKeyManagementCluster\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");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                           endpoint: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
                          completionHandler:^(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");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                           endpoint:0
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        MTRReadParams * params = [[MTRReadParams alloc] init];
        params.fabricFiltered = [NSNumber numberWithBool:true];
        [cluster
            readAttributeAclWithParams:params
                     completionHandler:^(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");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                           endpoint: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
                          completionHandler:^(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");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                           endpoint:0
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        MTRReadParams * params = [[MTRReadParams alloc] init];
        params.fabricFiltered = [NSNumber numberWithBool:true];
        [cluster
            readAttributeAclWithParams:params
                     completionHandler:^(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");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                           endpoint: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
                     completionHandler:^(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");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                           endpoint:0
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        MTRReadParams * params = [[MTRReadParams alloc] init];
        params.fabricFiltered = [NSNumber numberWithBool:true];
        [cluster readAttributeAclWithParams:params
                          completionHandler:^(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");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                           endpoint: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
                     completionHandler:^(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");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                           endpoint:0
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        MTRReadParams * params = [[MTRReadParams alloc] init];
        params.fabricFiltered = [NSNumber numberWithBool:true];
        [cluster readAttributeAclWithParams:params
                          completionHandler:^(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");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                           endpoint: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
                     completionHandler:^(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");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                           endpoint:0
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        MTRReadParams * params = [[MTRReadParams alloc] init];
        params.fabricFiltered = [NSNumber numberWithBool:true];
        [cluster readAttributeAclWithParams:params
                          completionHandler:^(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");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                           endpoint: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
                     completionHandler:^(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");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                           endpoint:0
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        MTRReadParams * params = [[MTRReadParams alloc] init];
        params.fabricFiltered = [NSNumber numberWithBool:true];
        [cluster readAttributeAclWithParams:params
                          completionHandler:^(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");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                           endpoint: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
                     completionHandler:^(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");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                           endpoint:0
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        MTRReadParams * params = [[MTRReadParams alloc] init];
        params.fabricFiltered = [NSNumber numberWithBool:true];
        [cluster readAttributeAclWithParams:params
                          completionHandler:^(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");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                           endpoint: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
                     completionHandler:^(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");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                           endpoint:0
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        MTRReadParams * params = [[MTRReadParams alloc] init];
        params.fabricFiltered = [NSNumber numberWithBool:true];
        [cluster readAttributeAclWithParams:params
                          completionHandler:^(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");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                           endpoint: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
                     completionHandler:^(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");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                           endpoint:0
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        MTRReadParams * params = [[MTRReadParams alloc] init];
        params.fabricFiltered = [NSNumber numberWithBool:true];
        [cluster
            readAttributeAclWithParams:params
                     completionHandler:^(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");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                           endpoint: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
                          completionHandler:^(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");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                           endpoint:0
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        MTRReadParams * params = [[MTRReadParams alloc] init];
        params.fabricFiltered = [NSNumber numberWithBool:true];
        [cluster readAttributeAclWithParams:params
                          completionHandler:^(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");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                           endpoint:0
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeSubjectsPerAccessControlEntryWithCompletionHandler:^(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");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                           endpoint:0
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeTargetsPerAccessControlEntryWithCompletionHandler:^(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");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                           endpoint:0
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeAccessControlEntriesPerFabricWithCompletionHandler:^(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_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");
        MTRBaseClusterBooleanState * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletionHandler:^(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");
        MTRBaseClusterBooleanState * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletionHandler:^(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");
        MTRBaseClusterBooleanState * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterBooleanState * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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");
        MTRBaseClusterBooleanState * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletionHandler:^(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");
        MTRBaseClusterBooleanState * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeStateValueWithCompletionHandler:^(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_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");
        MTRBaseClusterActions * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletionHandler:^(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");
        MTRBaseClusterActions * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletionHandler:^(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");
        MTRBaseClusterActions * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptionalAttributeSetupURLInAttributeList_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterActions * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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, 0UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 1UL));
            VerifyOrReturn(CheckConstraintContains("attributeList", value, 2UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterActions * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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");
        MTRBaseClusterActions * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletionHandler:^(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_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)")) {
                NextTest();
                return;
            }
            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(CurrentHue) in AttributeList\n");
            if (ShouldSkip("CC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeCurrentHueInAttributeList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the optional attribute(CurrentSaturation) in AttributeList\n");
            if (ShouldSkip("CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeCurrentSaturationInAttributeList_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read the optional attribute(RemainingTime) in AttributeList\n");
            if (ShouldSkip("CC.S.A0002")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeRemainingTimeInAttributeList_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read the optional attribute(CurrentX) in AttributeList\n");
            if (ShouldSkip("CC.S.A0003")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeCurrentXInAttributeList_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read the optional attribute(CurrentY) in AttributeList\n");
            if (ShouldSkip("CC.S.A0004")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeCurrentYInAttributeList_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Read the optional attribute(DriftCompensation) in AttributeList\n");
            if (ShouldSkip("CC.S.A0005")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeDriftCompensationInAttributeList_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Read the optional attribute(CompensationText) in AttributeList\n");
            if (ShouldSkip("CC.S.A0006")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeCompensationTextInAttributeList_10();
            break;
        case 11:
            ChipLogProgress(
                chipTool, " ***** Test Step 11 : Read the optional attribute(ColorTemperatureMireds) in AttributeList\n");
            if (ShouldSkip("CC.S.A0007")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeColorTemperatureMiredsInAttributeList_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Read the optional attribute(EnhancedCurrentHue) in AttributeList\n");
            if (ShouldSkip("CC.S.A4000")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeEnhancedCurrentHueInAttributeList_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Read the optional attribute(ColorLoopActive) in AttributeList\n");
            if (ShouldSkip("CC.S.A4002")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeColorLoopActiveInAttributeList_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Read the optional attribute(ColorLoopDirection) in AttributeList\n");
            if (ShouldSkip("CC.S.A4003")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeColorLoopDirectionInAttributeList_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Read the optional attribute(ColorLoopTime) in AttributeList\n");
            if (ShouldSkip("CC.S.A4004")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeColorLoopTimeInAttributeList_15();
            break;
        case 16:
            ChipLogProgress(
                chipTool, " ***** Test Step 16 : Read the optional attribute(ColorLoopStartEnhancedHue) in AttributeList\n");
            if (ShouldSkip("CC.S.A4005")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeColorLoopStartEnhancedHueInAttributeList_16();
            break;
        case 17:
            ChipLogProgress(
                chipTool, " ***** Test Step 17 : Read the optional attribute(ColorLoopStoredEnhancedHue) in AttributeList\n");
            if (ShouldSkip("CC.S.A4006")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeColorLoopStoredEnhancedHueInAttributeList_17();
            break;
        case 18:
            ChipLogProgress(
                chipTool, " ***** Test Step 18 : Read the optional attribute(ColorTempPhysicalMinMireds) in AttributeList\n");
            if (ShouldSkip("CC.S.A400b")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeColorTempPhysicalMinMiredsInAttributeList_18();
            break;
        case 19:
            ChipLogProgress(
                chipTool, " ***** Test Step 19 : Read the optional attribute(ColorTempPhysicalMaxMireds) in AttributeList\n");
            if (ShouldSkip("CC.S.A400c")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeColorTempPhysicalMaxMiredsInAttributeList_19();
            break;
        case 20:
            ChipLogProgress(
                chipTool, " ***** Test Step 20 : Read the optional attribute(CoupleColorTempToLevelMinMireds) in AttributeList\n");
            if (ShouldSkip("CC.S.A400d")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeCoupleColorTempToLevelMinMiredsInAttributeList_20();
            break;
        case 21:
            ChipLogProgress(
                chipTool, " ***** Test Step 21 : Read the optional attribute(StartUpColorTemperatureMireds) in AttributeList\n");
            if (ShouldSkip("CC.S.A4010")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeStartUpColorTemperatureMiredsInAttributeList_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : Read the optional command(MoveToHue) in AcceptedCommandList\n");
            if (ShouldSkip("CC.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandMoveToHueInAcceptedCommandList_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : Read the optional command(MoveHue) in AcceptedCommandList\n");
            if (ShouldSkip("CC.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandMoveHueInAcceptedCommandList_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : Read the optional command(StepHue) in AcceptedCommandList\n");
            if (ShouldSkip("CC.S.C02.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandStepHueInAcceptedCommandList_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : Read the optional command(MoveToSaturation) in AcceptedCommandList\n");
            if (ShouldSkip("CC.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandMoveToSaturationInAcceptedCommandList_25();
            break;
        case 26:
            ChipLogProgress(chipTool, " ***** Test Step 26 : Read the optional command(MoveSaturation) in AcceptedCommandList\n");
            if (ShouldSkip("CC.S.C04.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandMoveSaturationInAcceptedCommandList_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : Read the optional command(StepSaturation) in AcceptedCommandList\n");
            if (ShouldSkip("CC.S.C05.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandStepSaturationInAcceptedCommandList_27();
            break;
        case 28:
            ChipLogProgress(
                chipTool, " ***** Test Step 28 : Read the optional command(MoveToHueAndSaturation) in AcceptedCommandList\n");
            if (ShouldSkip("CC.S.C06.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandMoveToHueAndSaturationInAcceptedCommandList_28();
            break;
        case 29:
            ChipLogProgress(chipTool, " ***** Test Step 29 : Read the optional command(MoveToColor) in AcceptedCommandList\n");
            if (ShouldSkip("CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandMoveToColorInAcceptedCommandList_29();
            break;
        case 30:
            ChipLogProgress(chipTool, " ***** Test Step 30 : Read the optional command(MoveColor) in AcceptedCommandList\n");
            if (ShouldSkip("CC.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandMoveColorInAcceptedCommandList_30();
            break;
        case 31:
            ChipLogProgress(chipTool, " ***** Test Step 31 : Read the optional command(StepColor) in AcceptedCommandList\n");
            if (ShouldSkip("CC.S.C09.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandStepColorInAcceptedCommandList_31();
            break;
        case 32:
            ChipLogProgress(
                chipTool, " ***** Test Step 32 : Read the optional command(MoveToColorTemperature) in AcceptedCommandList\n");
            if (ShouldSkip("CC.S.C0a.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandMoveToColorTemperatureInAcceptedCommandList_32();
            break;
        case 33:
            ChipLogProgress(
                chipTool, " ***** Test Step 33 : Read the optional command(EnhancedMoveToHue) in AcceptedCommandList\n");
            if (ShouldSkip("CC.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandEnhancedMoveToHueInAcceptedCommandList_33();
            break;
        case 34:
            ChipLogProgress(chipTool, " ***** Test Step 34 : Read the optional command(EnhancedMoveHue) in AcceptedCommandList\n");
            if (ShouldSkip("CC.S.C41.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandEnhancedMoveHueInAcceptedCommandList_34();
            break;
        case 35:
            ChipLogProgress(chipTool, " ***** Test Step 35 : Read the optional command(EnhancedStepHue) in AcceptedCommandList\n");
            if (ShouldSkip("CC.S.C42.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandEnhancedStepHueInAcceptedCommandList_35();
            break;
        case 36:
            ChipLogProgress(chipTool,
                " ***** Test Step 36 : Read the optional command(EnhancedMoveToHueAndSaturation) in AcceptedCommandList\n");
            if (ShouldSkip("CC.S.C43.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandEnhancedMoveToHueAndSaturationInAcceptedCommandList_36();
            break;
        case 37:
            ChipLogProgress(chipTool, " ***** Test Step 37 : Read the optional command(ColorLoopSet) in AcceptedCommandList\n");
            if (ShouldSkip("CC.S.C44.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandColorLoopSetInAcceptedCommandList_37();
            break;
        case 38:
            ChipLogProgress(chipTool, " ***** Test Step 38 : Read the optional command(StopMoveStep) in AcceptedCommandList\n");
            if (ShouldSkip("CC.S.C47.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandStopMoveStepInAcceptedCommandList_38();
            break;
        case 39:
            ChipLogProgress(
                chipTool, " ***** Test Step 39 : Read the optional command(MoveColorTemperature) in AcceptedCommandList\n");
            if (ShouldSkip("CC.S.C4b.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandMoveColorTemperatureInAcceptedCommandList_39();
            break;
        case 40:
            ChipLogProgress(
                chipTool, " ***** Test Step 40 : Read the optional command(StepColorTemperature) in AcceptedCommandList\n");
            if (ShouldSkip("CC.S.C4c.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandStepColorTemperatureInAcceptedCommandList_40();
            break;
        case 41:
            ChipLogProgress(chipTool, " ***** Test Step 41 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_41();
            break;
        }

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

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

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

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

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

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

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

        [cluster readAttributeClusterRevisionWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletionHandler:^(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], 31UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_22()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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_23()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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_24()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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_25()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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_26()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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_27()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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_28()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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_29()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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_30()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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_31()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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_32()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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_33()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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_34()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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_35()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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_36()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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_37()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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_38()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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_39()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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_40()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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_41()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletionHandler:^(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 : TH reads FeatureMap attribute from DUT\n");
            err = TestThReadsFeatureMapAttributeFromDut_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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentHueWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRemainingTimeWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeDriftCompensationWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCompensationTextWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorTemperatureWithCompletionHandler:^(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("colorTemperature", "int16u", "int16u"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("colorTemperature", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("colorTemperature", [value unsignedShortValue], 65279U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorModeAttributeFromDut_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorModeWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOptionsWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedCurrentHueWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedColorModeWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorLoopActiveWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorLoopDirectionWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorLoopTimeWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeColorLoopStartEnhancedHueWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeColorLoopStoredEnhancedHueWithCompletionHandler:^(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 TestThReadsFeatureMapAttributeFromDut_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH 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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorCapabilitiesWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeColorTempPhysicalMinMiredsWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeColorTempPhysicalMaxMiredsWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCoupleColorTempToLevelMinMiredsWithCompletionHandler:^(
            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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

        [cluster readAttributeNumberOfPrimariesWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeWhitePointXWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeWhitePointYWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorPointRXWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorPointRYWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorPointRIntensityWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorPointGXWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorPointGYWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorPointGIntensityWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorPointBXWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorPointBYWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorPointBIntensityWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                              completionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                   completionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                 completionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentHueWithCompletionHandler:^(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], 245U));
            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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentHueWithCompletionHandler:^(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], 35U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentHue", [value unsignedCharValue], 55U));

            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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                 completionHandler:^(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;
    }
    NSNumber * _Nonnull CurrentHueValueStep2f;

    CHIP_ERROR TestThReadsCurrentHueAttributeFromDut_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentHueWithCompletionHandler:^(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));
            {
                CurrentHueValueStep2f = value;
            }

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

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

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

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentHue", actualValue, CurrentHueValueStep2f));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToHueCommandToDutWithHue60Direction0x00ShortestDistanceAndTransitionTime0Immediately_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                   completionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                 completionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentHueWithCompletionHandler:^(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], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentHue", [value unsignedCharValue], 20U));

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

        [cluster readAttributeCurrentHueWithCompletionHandler:^(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], 180U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentHue", [value unsignedCharValue], 240U));

            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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                 completionHandler:^(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;
    }
    NSNumber * _Nonnull CurrentHueValueStep3f;

    CHIP_ERROR TestThReadsCurrentHueAttributeFromDut_24()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentHueWithCompletionHandler:^(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], 180U));
            {
                CurrentHueValueStep3f = value;
            }

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

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

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

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentHue", actualValue, CurrentHueValueStep3f));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorModeAttributeFromDut_27()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

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

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

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("colorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("colorMode", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTurnOffLightThatWeTurnedOn_29()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                              completionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                   completionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
            completionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentHueWithCompletionHandler:^(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], 245U));

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

        [cluster readAttributeCurrentHueWithCompletionHandler:^(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], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentHue", [value unsignedCharValue], 10U));

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

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

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToHueCommandToDutWithHue50Direction0x00ShortestDistanceAndTransitionTime0Immediately_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                   completionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                 completionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentHueWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentHueWithCompletionHandler:^(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], 245U));
            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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentHue", actualValue, 245U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorModeAttributeFromDut_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

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

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

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("colorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("colorMode", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTurnOffLightThatWeTurnedOn_23()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                              completionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                          completionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                     completionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletionHandler:^(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], 110U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 120U));

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

        [cluster readAttributeCurrentSaturationWithCompletionHandler:^(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, 120U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorModeAttributeFromDut_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

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

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

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("colorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("colorMode", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTurnOffLightThatWeTurnedOn_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletionHandler:^(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=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 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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                              completionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                          completionHandler:^(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 TestThSendsMoveSaturationCommandToDutWithMoveMode0x01UpAndRate5UnitsS_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                   completionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletionHandler:^(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], 235U));
            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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletionHandler:^(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, 254U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToSaturationCommandToDutWithSaturation120AndTransitionTime0Immediately_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                          completionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                   completionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletionHandler:^(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], 60U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 80U));

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

        [cluster readAttributeCurrentSaturationWithCompletionHandler:^(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], 5U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 35U));

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

        [cluster readAttributeCurrentSaturationWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                          completionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                   completionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                   completionHandler:^(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;
    }
    NSNumber * _Nonnull CurrentSaturationValueStep4e;

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_27()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletionHandler:^(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));
            {
                CurrentSaturationValueStep4e = value;
            }

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

        [cluster readAttributeCurrentSaturationWithCompletionHandler:^(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, CurrentSaturationValueStep4e));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorModeAttributeFromDut_30()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

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

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

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("colorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("colorMode", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTurnOffLightThatWeTurnedOn_32()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                              completionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                          completionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                        completionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletionHandler:^(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], 210U));
            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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletionHandler:^(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], 230U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 240U));

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

        [cluster readAttributeCurrentSaturationWithCompletionHandler:^(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, 240U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsStepSaturationCommandToDutWithStepMode0x01UpStepSize20AndTransitionTime10010s_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                        completionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletionHandler:^(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, 254U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToSaturationCommandToDutWithSaturation50AndTransitionTime0Immediately_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                          completionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                        completionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletionHandler:^(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], 10U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 15U));

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

        [cluster readAttributeCurrentSaturationWithCompletionHandler:^(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, 10U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsStepSaturationCommandToDutWithStepMode0x03DownStepSize20AndTransitionTime10010S_24()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                        completionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

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

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

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("colorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("colorMode", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTurnOffLightThatWeTurnedOn_29()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletionHandler:^(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.F01 && 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.F01 && CC.S.A0000 && CC.S.C06.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentHueAttributeFromDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool,
                " ***** Test Step 6 : TH sends MoveToHueAndSaturation command to DUT with Hue=160, Saturation=80 and "
                "TransitionTime=200 (20s)\n");
            if (ShouldSkip("CC.S.F01 && CC.S.C06.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToHueAndSaturationCommandToDutWithHue160Saturation80AndTransitionTime20020s_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Wait 10s\n");
            err = TestWait10s_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : TH reads CurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentHueAttributeFromDut_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F01 && 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 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 reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F01 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Wait 5s\n");
            err = TestWait5s_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 reads CurrentSaturation attribute from DUT\n");
            if (ShouldSkip("CC.S.F01 && CC.S.A0001")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentSaturationAttributeFromDut_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : TH reads ColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0008")) {
                NextTest();
                return;
            }
            err = TestThReadsColorModeAttributeFromDut_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : TH reads EnhancedColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A4001")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedColorModeAttributeFromDut_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Turn off light that we turned on\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestTurnOffLightThatWeTurnedOn_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Check on/off attribute value is false after off command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsFalseAfterOffCommand_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 TestThWrites0ToTheOptionsAttribute_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                              completionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                                completionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentHue", actualValue, 200U));
            }

            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 TestThSendsMoveToHueAndSaturationCommandToDutWithHue160Saturation80AndTransitionTime20020s_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                                completionHandler:^(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_7()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentHueAttributeFromDut_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentHueWithCompletionHandler:^(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], 175U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentHue", [value unsignedCharValue], 185U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletionHandler:^(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], 60U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 70U));

            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 TestThReadsCurrentHueAttributeFromDut_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentHueWithCompletionHandler:^(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], 170U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletionHandler:^(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], 70U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 80U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait5s_13()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 5000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentHueAttributeFromDut_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentHue", actualValue, 160U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletionHandler:^(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_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("colorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("colorMode", [value unsignedCharValue], 2U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsEnhancedColorModeAttributeFromDut_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("colorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("colorMode", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTurnOffLightThatWeTurnedOn_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletionHandler:^(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_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletionHandler:^(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 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_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Wait 100ms\n");
            err = TestWait100ms_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : TH reads CurrentX attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentXAttributeFromDut_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : TH reads CurrentY attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentYAttributeFromDut_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : TH sends Off command to DUT\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOffCommandToDut_23();
            break;
        case 24:
            ChipLogProgress(chipTool,
                " ***** Test Step 24 : 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_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : Wait 100ms\n");
            err = TestWait100ms_25();
            break;
        case 26:
            ChipLogProgress(chipTool, " ***** Test Step 26 : TH reads CurrentX attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentXAttributeFromDut_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : TH reads CurrentY attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentYAttributeFromDut_27();
            break;
        case 28:
            ChipLogProgress(chipTool,
                " ***** Test Step 28 : 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_28();
            break;
        case 29:
            ChipLogProgress(chipTool, " ***** Test Step 29 : Wait 100ms\n");
            err = TestWait100ms_29();
            break;
        case 30:
            ChipLogProgress(chipTool, " ***** Test Step 30 : TH reads CurrentX attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentXAttributeFromDut_30();
            break;
        case 31:
            ChipLogProgress(chipTool, " ***** Test Step 31 : TH reads CurrentY attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentYAttributeFromDut_31();
            break;
        case 32:
            ChipLogProgress(chipTool,
                " ***** Test Step 32 : 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_32();
            break;
        case 33:
            ChipLogProgress(chipTool, " ***** Test Step 33 : Wait 100ms\n");
            err = TestWait100ms_33();
            break;
        case 34:
            ChipLogProgress(chipTool, " ***** Test Step 34 : TH reads CurrentX attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentXAttributeFromDut_34();
            break;
        case 35:
            ChipLogProgress(chipTool, " ***** Test Step 35 : TH reads CurrentY attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentYAttributeFromDut_35();
            break;
        case 36:
            ChipLogProgress(chipTool, " ***** Test Step 36 : TH writes 1 to the Options attribute\n");
            if (ShouldSkip("CC.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThWrites1ToTheOptionsAttribute_36();
            break;
        case 37:
            ChipLogProgress(chipTool, " ***** Test Step 37 : TH read Options attribute\n");
            if (ShouldSkip("CC.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThReadOptionsAttribute_37();
            break;
        case 38:
            ChipLogProgress(chipTool, " ***** Test Step 38 : TH sends On command to DUT\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_38();
            break;
        case 39:
            ChipLogProgress(chipTool,
                " ***** Test Step 39 : 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_39();
            break;
        case 40:
            ChipLogProgress(chipTool, " ***** Test Step 40 : Wait 100ms\n");
            err = TestWait100ms_40();
            break;
        case 41:
            ChipLogProgress(chipTool, " ***** Test Step 41 : TH reads CurrentX attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentXAttributeFromDut_41();
            break;
        case 42:
            ChipLogProgress(chipTool, " ***** Test Step 42 : TH reads CurrentY attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentYAttributeFromDut_42();
            break;
        case 43:
            ChipLogProgress(chipTool, " ***** Test Step 43 : TH sends Off command to DUT\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOffCommandToDut_43();
            break;
        case 44:
            ChipLogProgress(chipTool,
                " ***** Test Step 44 : 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_44();
            break;
        case 45:
            ChipLogProgress(chipTool, " ***** Test Step 45 : Wait 100ms\n");
            err = TestWait100ms_45();
            break;
        case 46:
            ChipLogProgress(chipTool, " ***** Test Step 46 : TH reads CurrentX attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentXAttributeFromDut_46();
            break;
        case 47:
            ChipLogProgress(chipTool, " ***** Test Step 47 : TH reads CurrentY attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentYAttributeFromDut_47();
            break;
        case 48:
            ChipLogProgress(chipTool,
                " ***** Test Step 48 : 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_48();
            break;
        case 49:
            ChipLogProgress(chipTool, " ***** Test Step 49 : Wait 100ms\n");
            err = TestWait100ms_49();
            break;
        case 50:
            ChipLogProgress(chipTool, " ***** Test Step 50 : TH reads CurrentX attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentXAttributeFromDut_50();
            break;
        case 51:
            ChipLogProgress(chipTool, " ***** Test Step 51 : TH reads CurrentY attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentYAttributeFromDut_51();
            break;
        case 52:
            ChipLogProgress(chipTool,
                " ***** Test Step 52 : 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_52();
            break;
        case 53:
            ChipLogProgress(chipTool, " ***** Test Step 53 : Wait 100ms\n");
            err = TestWait100ms_53();
            break;
        case 54:
            ChipLogProgress(chipTool, " ***** Test Step 54 : TH reads CurrentX attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0003 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentXAttributeFromDut_54();
            break;
        case 55:
            ChipLogProgress(chipTool, " ***** Test Step 55 : TH reads CurrentY attribute from DUT\n");
            if (ShouldSkip("CC.S.F03 && CC.S.A0004 && CC.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentYAttributeFromDut_55();
            break;
        case 56:
            ChipLogProgress(chipTool, " ***** Test Step 56 : TH reads ColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A0008")) {
                NextTest();
                return;
            }
            err = TestThReadsColorModeAttributeFromDut_56();
            break;
        case 57:
            ChipLogProgress(chipTool, " ***** Test Step 57 : TH reads EnhancedColorMode attribute from DUT\n");
            if (ShouldSkip("CC.S.F00 && CC.S.A4001")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedColorModeAttributeFromDut_57();
            break;
        }

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

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

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

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

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

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

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

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                              completionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                     completionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletionHandler:^(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_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletionHandler:^(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 TestThSendsMoveToColorCommandToDutWithColorX131070x3333ColorY131070x3333TransitionTime20020s_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                     completionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletionHandler:^(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], 15073U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletionHandler:^(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], 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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletionHandler:^(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_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletionHandler:^(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 TestThWrites0ToTheOptionsAttribute_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                              completionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOptionsWithCompletionHandler:^(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 TestThSendsAMoveToColorCommandToTheDutWithColorX327680x8000X05PurpleColorY196600x4CCCY03TransitionTime0Immediate_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                     completionHandler:^(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_20()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentXAttributeFromDut_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletionHandler:^(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_22()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletionHandler:^(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 TestThSendsOffCommandToDut_23()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletionHandler:^(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_24()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                     completionHandler:^(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_25()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentXAttributeFromDut_26()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletionHandler:^(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_27()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletionHandler:^(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_28()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                     completionHandler:^(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_29()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentXAttributeFromDut_30()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletionHandler:^(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_31()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletionHandler:^(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_32()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                     completionHandler:^(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_33()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentXAttributeFromDut_34()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletionHandler:^(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, 26214U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_35()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletionHandler:^(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, 32768U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWrites1ToTheOptionsAttribute_36()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:1U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                              completionHandler:^(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_37()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOptionsWithCompletionHandler:^(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_38()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletionHandler:^(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_39()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                     completionHandler:^(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_40()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentXAttributeFromDut_41()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletionHandler:^(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_42()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletionHandler:^(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 TestThSendsOffCommandToDut_43()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletionHandler:^(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_44()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                     completionHandler:^(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_45()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentXAttributeFromDut_46()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletionHandler:^(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_47()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletionHandler:^(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 TestThSendsMoveToColorCommandToDutWithColorX131070x3333ColorY327680x8000TransitionTime0Immediate_48()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                     completionHandler:^(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_49()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentXAttributeFromDut_50()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletionHandler:^(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_51()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletionHandler:^(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_52()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                     completionHandler:^(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_53()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentXAttributeFromDut_54()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletionHandler:^(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, 26214U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_55()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletionHandler:^(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, 32768U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorModeAttributeFromDut_56()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("colorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("colorMode", [value unsignedCharValue], 2U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsEnhancedColorModeAttributeFromDut_57()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("colorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("colorMode", [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.F00 && 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.F00 && 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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                              completionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                     completionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                   completionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletionHandler:^(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], 31500U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentX", [value unsignedShortValue], 32500U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletionHandler:^(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], 26500U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentY", [value unsignedShortValue], 27500U));

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

        [cluster readAttributeCurrentXWithCompletionHandler:^(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], 30500U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentX", [value unsignedShortValue], 31500U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletionHandler:^(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], 27500U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentY", [value unsignedShortValue], 28500U));

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

        [cluster readAttributeCurrentXWithCompletionHandler:^(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], 29500U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentX", [value unsignedShortValue], 30500U));
            {
                CurrentXValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull CurrentYValue;

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletionHandler:^(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], 28500U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentY", [value unsignedShortValue], 29500U));
            {
                CurrentYValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsStopMoveStepCommandToDut_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                      completionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletionHandler:^(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], 29500U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentX", [value unsignedShortValue], 30500U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletionHandler:^(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], 28500U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("currentY", [value unsignedShortValue], 29500U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorModeAttributeFromDut_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

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

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

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("colorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("colorMode", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTurnOffLightThatWeTurnedOn_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletionHandler:^(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 = -2000, StepY = -6000, TransitionTime = 200 "
                "(20s)\n");
            if (ShouldSkip("CC.S.F03 && CC.S.C09.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsStepColorCommandToDutWithStepX2000StepY6000TransitionTime20020s_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.F00 && 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.F00 && 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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                              completionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                     completionHandler:^(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 TestThSendsStepColorCommandToDutWithStepX2000StepY6000TransitionTime20020s_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
              completionHandler:^(NSError * _Nullable err) {
                  NSLog(
                      @"TH sends StepColor command to DUT, with StepX = -2000, 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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentXWithCompletionHandler:^(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], 14000U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletionHandler:^(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], 15000U));

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

        [cluster readAttributeCurrentXWithCompletionHandler:^(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, 13000U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentYAttributeFromDut_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentYWithCompletionHandler:^(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, 14000U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorModeAttributeFromDut_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

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

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

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("colorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("colorMode", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTurnOffLightThatWeTurnedOn_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletionHandler:^(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.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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                              completionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeColorTempPhysicalMinMiredsWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeColorTempPhysicalMaxMiredsWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorTemperatureWithCompletionHandler:^(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("colorTemperature", "int16u", "int16u"));
            VerifyOrReturn(
                CheckConstraintMinValue<uint16_t>("colorTemperature", [value unsignedShortValue], ColorTempPhysicalMinMiredsValue));
            VerifyOrReturn(
                CheckConstraintMaxValue<uint16_t>("colorTemperature", [value unsignedShortValue], ColorTempPhysicalMaxMiredsValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToColorTemperatureCommandToDutWithColorTemperatureMireds310AndTransitionTime0Immediately_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                                completionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                                completionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorTemperatureWithCompletionHandler:^(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>("colorTemperature", [value unsignedShortValue], 280U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("colorTemperature", [value unsignedShortValue], 300U));

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

        [cluster readAttributeColorTemperatureWithCompletionHandler:^(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>("colorTemperature", [value unsignedShortValue], 260U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("colorTemperature", [value unsignedShortValue], 280U));

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

        [cluster readAttributeColorTemperatureWithCompletionHandler:^(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>("colorTemperature", [value unsignedShortValue], 250U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("colorTemperature", [value unsignedShortValue], 260U));

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

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

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

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ColorTemperature", actualValue, 250U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorModeAttributeFromDut_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

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

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

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("colorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("colorMode", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTurnOffLightThatWeTurnedOn_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletionHandler:^(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_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_CC_6_2()
        : TestCommandBridge("Test_TC_CC_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_CC_6_2() {}

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

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

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_CC_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 : 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=(ColorTempPhysicalMinMireds + ColorTempPhysicalMaxMireds)/2 and TransitionTime=0 "
                "(immediately).\n");
            if (ShouldSkip("CC.S.F04 && CC.S.C0a.Rsp && PICS_USER_PROMPT")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToColorTemperatureCommandToDutWithColorTemperatureMiredsColorTempPhysicalMinMiredsColorTempPhysicalMaxMireds2AndTransitionTime0Immediately_6();
            break;
        case 7:
            ChipLogProgress(chipTool,
                " ***** Test Step 7 : TH sends MoveColorTemperature command to DUT with MoveMode = 0x01 (up), Rate = "
                "(ColorTempPhysicalMaxMireds - ColorTempPhysicalMinMireds)/40\n");
            if (ShouldSkip("CC.S.F04 && CC.S.C4b.Rsp && PICS_USER_PROMPT")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveColorTemperatureCommandToDutWithMoveMode0x01UpRateColorTempPhysicalMaxMiredsColorTempPhysicalMinMireds40_7();
            break;
        case 8:
            ChipLogProgress(
                chipTool, " ***** Test Step 8 : After 10 seconds, TH reads ColorTemperatureMireds attribute from DUT.\n");
            if (ShouldSkip("CC.S.F04 && CC.S.A0007 && PICS_USER_PROMPT")) {
                NextTest();
                return;
            }
            err = TestAfter10SecondsThReadsColorTemperatureMiredsAttributeFromDut_8();
            break;
        case 9:
            ChipLogProgress(
                chipTool, " ***** Test Step 9 : After 10 seconds, TH reads ColorTemperatureMireds attribute from DUT.\n");
            if (ShouldSkip("CC.S.F04 && CC.S.A0007 && PICS_USER_PROMPT")) {
                NextTest();
                return;
            }
            err = TestAfter10SecondsThReadsColorTemperatureMiredsAttributeFromDut_9();
            break;
        case 10:
            ChipLogProgress(
                chipTool, " ***** Test Step 10 : After another 5 seconds, TH reads ColorTemperatureMireds attribute from DUT.\n");
            if (ShouldSkip("CC.S.F04 && CC.S.A0007 && PICS_USER_PROMPT")) {
                NextTest();
                return;
            }
            err = TestAfterAnother5SecondsThReadsColorTemperatureMiredsAttributeFromDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool,
                " ***** Test Step 11 : TH sends MoveColorTemperature command to DUT with MoveMode = 0x03(down), Rate = "
                "(ColorTempPhysicalMaxMireds - ColorTempPhysicalMinMireds)/20\n");
            if (ShouldSkip("CC.S.F04 && CC.S.C4b.Rsp && PICS_USER_PROMPT")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveColorTemperatureCommandToDutWithMoveMode0x03downRateColorTempPhysicalMaxMiredsColorTempPhysicalMinMireds20_11();
            break;
        case 12:
            ChipLogProgress(
                chipTool, " ***** Test Step 12 : After 10 seconds, TH reads ColorTemperatureMireds attribute from DUT.\n");
            if (ShouldSkip("CC.S.F04 && CC.S.A0007 && PICS_USER_PROMPT")) {
                NextTest();
                return;
            }
            err = TestAfter10SecondsThReadsColorTemperatureMiredsAttributeFromDut_12();
            break;
        case 13:
            ChipLogProgress(
                chipTool, " ***** Test Step 13 : After 10 seconds, TH reads ColorTemperatureMireds attribute from DUT.\n");
            if (ShouldSkip("CC.S.F04 && CC.S.A0007 && PICS_USER_PROMPT")) {
                NextTest();
                return;
            }
            err = TestAfter10SecondsThReadsColorTemperatureMiredsAttributeFromDut_13();
            break;
        case 14:
            ChipLogProgress(
                chipTool, " ***** Test Step 14 : After another 5 seconds, TH reads ColorTemperatureMireds attribute from DUT.\n");
            if (ShouldSkip("CC.S.F04 && CC.S.A0007 && PICS_USER_PROMPT")) {
                NextTest();
                return;
            }
            err = TestAfterAnother5SecondsThReadsColorTemperatureMiredsAttributeFromDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool,
                " ***** Test Step 15 : TH sends MoveColorTemperature command to DUT with MoveMode = 0x01(up), Rate = "
                "(ColorTempPhysicalMaxMireds - ColorTempPhysicalMinMireds)/20\n");
            if (ShouldSkip("CC.S.F04 && CC.S.C4b.Rsp && PICS_USER_PROMPT")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveColorTemperatureCommandToDutWithMoveMode0x01upRateColorTempPhysicalMaxMiredsColorTempPhysicalMinMireds20_15();
            break;
        case 16:
            ChipLogProgress(chipTool,
                " ***** Test Step 16 : After 10 seconds, TH sends MoveColorTemperature command to DUT with MoveMode = 0x00(stop), "
                "Rate = (ColorTempPhysicalMaxMireds - ColorTempPhysicalMinMireds)/20\n");
            if (ShouldSkip("CC.S.F04 && CC.S.C4b.Rsp && PICS_USER_PROMPT")) {
                NextTest();
                return;
            }
            err = TestAfter10SecondsThSendsMoveColorTemperatureCommandToDutWithMoveMode0x00stopRateColorTempPhysicalMaxMiredsColorTempPhysicalMinMireds20_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : TH reads ColorTemperatureMireds attribute from DUT.\n");
            if (ShouldSkip("CC.S.F04 && CC.S.A0007 && PICS_USER_PROMPT")) {
                NextTest();
                return;
            }
            err = TestThReadsColorTemperatureMiredsAttributeFromDut_17();
            break;
        case 18:
            ChipLogProgress(
                chipTool, " ***** Test Step 18 : After another 2 seconds, TH reads ColorTemperatureMireds attribute from DUT\n");
            if (ShouldSkip("CC.S.F04 && CC.S.A0007 && PICS_USER_PROMPT")) {
                NextTest();
                return;
            }
            err = TestAfterAnother2SecondsThReadsColorTemperatureMiredsAttributeFromDut_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : TH reads ColorMode attribute from DUT.\n");
            if (ShouldSkip("CC.S.F04 && CC.S.A0008 && PICS_USER_PROMPT")) {
                NextTest();
                return;
            }
            err = TestThReadsColorModeAttributeFromDut_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : TH reads EnhancedColorMode attribute from DUT.\n");
            if (ShouldSkip("CC.S.F04 && CC.S.A4001 && PICS_USER_PROMPT")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedColorModeAttributeFromDut_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Turn off light that we turned on\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestTurnOffLightThatWeTurnedOn_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 TestThWrites0ToTheOptionsAttribute_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                              completionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeColorTempPhysicalMinMiredsWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeColorTempPhysicalMaxMiredsWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorTemperatureWithCompletionHandler:^(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("colorTemperature", "int16u", "int16u"));
            VerifyOrReturn(
                CheckConstraintMinValue<uint16_t>("colorTemperature", [value unsignedShortValue], ColorTempPhysicalMinMiredsValue));
            VerifyOrReturn(
                CheckConstraintMaxValue<uint16_t>("colorTemperature", [value unsignedShortValue], ColorTempPhysicalMaxMiredsValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestThSendsMoveToColorTemperatureCommandToDutWithColorTemperatureMiredsColorTempPhysicalMinMiredsColorTempPhysicalMaxMireds2AndTransitionTime0Immediately_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
    TestThSendsMoveColorTemperatureCommandToDutWithMoveMode0x01UpRateColorTempPhysicalMaxMiredsColorTempPhysicalMinMireds40_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 TestAfter10SecondsThReadsColorTemperatureMiredsAttributeFromDut_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 TestAfter10SecondsThReadsColorTemperatureMiredsAttributeFromDut_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 TestAfterAnother5SecondsThReadsColorTemperatureMiredsAttributeFromDut_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
    TestThSendsMoveColorTemperatureCommandToDutWithMoveMode0x03downRateColorTempPhysicalMaxMiredsColorTempPhysicalMinMireds20_11()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("please enter 'y' for successgarbage: not 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 TestAfter10SecondsThReadsColorTemperatureMiredsAttributeFromDut_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 TestAfter10SecondsThReadsColorTemperatureMiredsAttributeFromDut_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 TestAfterAnother5SecondsThReadsColorTemperatureMiredsAttributeFromDut_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
    TestThSendsMoveColorTemperatureCommandToDutWithMoveMode0x01upRateColorTempPhysicalMaxMiredsColorTempPhysicalMinMireds20_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
    TestAfter10SecondsThSendsMoveColorTemperatureCommandToDutWithMoveMode0x00stopRateColorTempPhysicalMaxMiredsColorTempPhysicalMinMireds20_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 TestThReadsColorTemperatureMiredsAttributeFromDut_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 TestAfterAnother2SecondsThReadsColorTemperatureMiredsAttributeFromDut_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 TestThReadsColorModeAttributeFromDut_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 TestThReadsEnhancedColorModeAttributeFromDut_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);
    }

    CHIP_ERROR TestTurnOffLightThatWeTurnedOn_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletionHandler:^(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_22()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletionHandler:^(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_3 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_CC_6_3()
        : TestCommandBridge("Test_TC_CC_6_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_6_3() {}

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

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

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_CC_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 : 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=(ColorTempPhysicalMinMireds + ColorTempPhysicalMaxMireds)/2 and TransitionTime=0 "
                "(immediately).\n");
            if (ShouldSkip("CC.S.F04 && CC.S.C0a.Rsp && PICS_USER_PROMPT")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToColorTemperatureCommandToDutWithColorTemperatureMiredsColorTempPhysicalMinMiredsColorTempPhysicalMaxMireds2AndTransitionTime0Immediately_6();
            break;
        case 7:
            ChipLogProgress(chipTool,
                " ***** Test Step 7 : TH sends StepColorTemperature command to DUT with StepMode = 0x01 (up), StepSize = "
                "(ColorTempPhysicalMaxMireds - ColorTempPhysicalMinMireds)/2 and TransitionTime = 200 (20s).\n");
            if (ShouldSkip("CC.S.F04 && CC.S.C4c.Rsp && PICS_USER_PROMPT")) {
                NextTest();
                return;
            }
            err = TestThSendsStepColorTemperatureCommandToDutWithStepMode0x01UpStepSizeColorTempPhysicalMaxMiredsColorTempPhysicalMinMireds2AndTransitionTime20020s_7();
            break;
        case 8:
            ChipLogProgress(
                chipTool, " ***** Test Step 8 : After 10 seconds, TH reads ColorTemperatureMireds attribute from DUT.\n");
            if (ShouldSkip("CC.S.F04 && CC.S.A0007 && PICS_USER_PROMPT")) {
                NextTest();
                return;
            }
            err = TestAfter10SecondsThReadsColorTemperatureMiredsAttributeFromDut_8();
            break;
        case 9:
            ChipLogProgress(
                chipTool, " ***** Test Step 9 : After 10 seconds, TH reads ColorTemperatureMireds attribute from DUT.\n");
            if (ShouldSkip("CC.S.F04 && CC.S.A0007 && PICS_USER_PROMPT")) {
                NextTest();
                return;
            }
            err = TestAfter10SecondsThReadsColorTemperatureMiredsAttributeFromDut_9();
            break;
        case 10:
            ChipLogProgress(
                chipTool, " ***** Test Step 10 : After another 5 seconds, TH reads ColorTemperatureMireds attribute from DUT.\n");
            if (ShouldSkip("CC.S.F04 && CC.S.A0007 && PICS_USER_PROMPT")) {
                NextTest();
                return;
            }
            err = TestAfterAnother5SecondsThReadsColorTemperatureMiredsAttributeFromDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool,
                " ***** Test Step 11 : TH sends StepColorTemperature command to DUT with StepMode = 0x03 (down), StepSize = "
                "(ColorTempPhysicalMaxMireds - ColorTempPhysicalMinMireds) and TransitionTime = 200 (20s).\n");
            if (ShouldSkip("CC.S.F04 && CC.S.C4c.Rsp && PICS_USER_PROMPT")) {
                NextTest();
                return;
            }
            err = TestThSendsStepColorTemperatureCommandToDutWithStepMode0x03DownStepSizeColorTempPhysicalMaxMiredsColorTempPhysicalMinMiredsAndTransitionTime20020s_11();
            break;
        case 12:
            ChipLogProgress(
                chipTool, " ***** Test Step 12 : After 10 seconds, TH reads ColorTemperatureMireds attribute from DUT.\n");
            if (ShouldSkip("CC.S.F04 && CC.S.A0007 && PICS_USER_PROMPT")) {
                NextTest();
                return;
            }
            err = TestAfter10SecondsThReadsColorTemperatureMiredsAttributeFromDut_12();
            break;
        case 13:
            ChipLogProgress(
                chipTool, " ***** Test Step 13 : After 10 seconds, TH reads ColorTemperatureMireds attribute from DUT.\n");
            if (ShouldSkip("CC.S.F04 && CC.S.A0007 && PICS_USER_PROMPT")) {
                NextTest();
                return;
            }
            err = TestAfter10SecondsThReadsColorTemperatureMiredsAttributeFromDut_13();
            break;
        case 14:
            ChipLogProgress(
                chipTool, " ***** Test Step 14 : After another 5 seconds, TH reads ColorTemperatureMireds attribute from DUT.\n");
            if (ShouldSkip("CC.S.F04 && CC.S.A0007 && PICS_USER_PROMPT")) {
                NextTest();
                return;
            }
            err = TestAfterAnother5SecondsThReadsColorTemperatureMiredsAttributeFromDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : TH reads ColorMode attribute from DUT.\n");
            if (ShouldSkip("CC.S.F04 && CC.S.A0008 && PICS_USER_PROMPT")) {
                NextTest();
                return;
            }
            err = TestThReadsColorModeAttributeFromDut_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : TH reads EnhancedColorMode attribute from DUT.\n");
            if (ShouldSkip("CC.S.F04 && CC.S.A4001 && PICS_USER_PROMPT")) {
                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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                              completionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeColorTempPhysicalMinMiredsWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeColorTempPhysicalMaxMiredsWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeColorTemperatureWithCompletionHandler:^(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("colorTemperature", "int16u", "int16u"));
            VerifyOrReturn(
                CheckConstraintMinValue<uint16_t>("colorTemperature", [value unsignedShortValue], ColorTempPhysicalMinMiredsValue));
            VerifyOrReturn(
                CheckConstraintMaxValue<uint16_t>("colorTemperature", [value unsignedShortValue], ColorTempPhysicalMaxMiredsValue));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestThSendsMoveToColorTemperatureCommandToDutWithColorTemperatureMiredsColorTempPhysicalMinMiredsColorTempPhysicalMaxMireds2AndTransitionTime0Immediately_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
    TestThSendsStepColorTemperatureCommandToDutWithStepMode0x01UpStepSizeColorTempPhysicalMaxMiredsColorTempPhysicalMinMireds2AndTransitionTime20020s_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 TestAfter10SecondsThReadsColorTemperatureMiredsAttributeFromDut_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 TestAfter10SecondsThReadsColorTemperatureMiredsAttributeFromDut_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 TestAfterAnother5SecondsThReadsColorTemperatureMiredsAttributeFromDut_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
    TestThSendsStepColorTemperatureCommandToDutWithStepMode0x03DownStepSizeColorTempPhysicalMaxMiredsColorTempPhysicalMinMiredsAndTransitionTime20020s_11()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("please enter 'y' for successgarbage: not 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 TestAfter10SecondsThReadsColorTemperatureMiredsAttributeFromDut_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 TestAfter10SecondsThReadsColorTemperatureMiredsAttributeFromDut_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 TestAfterAnother5SecondsThReadsColorTemperatureMiredsAttributeFromDut_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 TestThReadsColorModeAttributeFromDut_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 TestThReadsEnhancedColorModeAttributeFromDut_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 TestTurnOffLightThatWeTurnedOn_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletionHandler:^(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.F00 && 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.F00 && 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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                              completionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                           completionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                         completionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedCurrentHueWithCompletionHandler:^(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], 7000U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 9000U));

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

        [cluster readAttributeEnhancedCurrentHueWithCompletionHandler:^(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], 9000U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 11000U));

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

        [cluster readAttributeEnhancedCurrentHueWithCompletionHandler:^(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], 11000U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 12000U));

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

        [cluster readAttributeEnhancedCurrentHueWithCompletionHandler:^(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, 12000U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestThSendsEnhancedMoveToHueCommandToDutWithEnhancedHue12000Direction0x00ShortestDistanceAndTransitionTime0Immediately_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                           completionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                         completionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedCurrentHueWithCompletionHandler:^(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], 9000U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 11000U));

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

        [cluster readAttributeEnhancedCurrentHueWithCompletionHandler:^(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], 7000U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 9000U));

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

        [cluster readAttributeEnhancedCurrentHueWithCompletionHandler:^(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], 6000U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 7000U));

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

        [cluster readAttributeEnhancedCurrentHueWithCompletionHandler:^(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, 6000U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsColorModeAttributeFromDut_25()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

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

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

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("colorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("colorMode", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTurnOffLightThatWeTurnedOn_27()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletionHandler:^(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.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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                              completionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                                        completionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedCurrentHueWithCompletionHandler:^(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, 20000U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletionHandler:^(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, 50U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsEnhancedMoveToHueAndSaturationCommandToDutWithEnhancedHue16000Saturation80AndTransitionTime20020s_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                                        completionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedCurrentHueWithCompletionHandler:^(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], 17000U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 19000U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletionHandler:^(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], 56U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 74U));

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

        [cluster readAttributeEnhancedCurrentHueWithCompletionHandler:^(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], 17000U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletionHandler:^(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], 80U));

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

        [cluster readAttributeEnhancedCurrentHueWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

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

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

            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("colorMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("colorMode", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTurnOffLightThatWeTurnedOn_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletionHandler:^(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_8_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_CC_8_1()
        : TestCommandBridge("Test_TC_CC_8_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_8_1() {}

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

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

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_CC_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 : TH writes 0 to the Options attribute\n");
            if (ShouldSkip("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.C01.Rsp && CC.S.F00")) {
                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 sends StopMoveStep command to DUT\n");
            if (ShouldSkip("CC.S.C47.Rsp && CC.S.F00")) {
                NextTest();
                return;
            }
            err = TestThSendsStopMoveStepCommandToDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : TH reads CurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.A0000 && CC.S.C01.Rsp && CC.S.F00")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentHueAttributeFromDut_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Wait 2s\n");
            err = TestWait2s_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : TH reads CurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.A0000 && CC.S.C01.Rsp && CC.S.F00")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentHueAttributeFromDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool,
                " ***** Test Step 11 : 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_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Wait 100ms\n");
            err = TestWait100ms_12();
            break;
        case 13:
            ChipLogProgress(chipTool,
                " ***** Test Step 13 : 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_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Wait 10s\n");
            err = TestWait10s_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : TH sends StopMoveStep command to DUT\n");
            if (ShouldSkip("CC.S.C47.Rsp && CC.S.F00")) {
                NextTest();
                return;
            }
            err = TestThSendsStopMoveStepCommandToDut_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 2s\n");
            err = TestWait2s_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 : TH reads ColorTempPhysicalMinMireds attribute from DUT\n");
            if (ShouldSkip("CC.S.F04 && CC.S.A400b")) {
                NextTest();
                return;
            }
            err = TestThReadsColorTempPhysicalMinMiredsAttributeFromDut_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : TH reads ColorTempPhysicalMaxMireds attribute from DUT.\n");
            if (ShouldSkip("CC.S.F04 && CC.S.A400c")) {
                NextTest();
                return;
            }
            err = TestThReadsColorTempPhysicalMaxMiredsAttributeFromDut_20();
            break;
        case 21:
            ChipLogProgress(chipTool,
                " ***** Test Step 21 : TH sends MoveToColorTemperature command to DUT with ColorTemperatureMireds= "
                "ColorTempPhysicalMaxMireds / 2 and TransitionTime=0 (immediately).\n");
            if (ShouldSkip("CC.S.F04 && CC.S.C0a.Rsp && PICS_USER_PROMPT")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveToColorTemperatureCommandToDutWithColorTemperatureMiredsColorTempPhysicalMaxMireds2AndTransitionTime0Immediately_21();
            break;
        case 22:
            ChipLogProgress(chipTool,
                " ***** Test Step 22 : TH sends MoveColorTemperature command to DUT with MoveMode = 0x01 (up), Rate = "
                "ColorTempPhysicalMaxMireds / 40\n");
            if (ShouldSkip("CC.S.F04 && CC.S.C0a.Rsp && PICS_USER_PROMPT")) {
                NextTest();
                return;
            }
            err = TestThSendsMoveColorTemperatureCommandToDutWithMoveMode0x01UpRateColorTempPhysicalMaxMireds40_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : After 10 seconds, TH sends StopMoveStep command to DUT.\n");
            if (ShouldSkip("CC.S.F04 && CC.S.C47.Rsp && PICS_USER_PROMPT")) {
                NextTest();
                return;
            }
            err = TestAfter10SecondsThSendsStopMoveStepCommandToDut_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : TH reads ColorTemperatureMireds attribute from DUT.\n");
            if (ShouldSkip("CC.S.F04 && CC.S.A0007 && PICS_USER_PROMPT")) {
                NextTest();
                return;
            }
            err = TestThReadsColorTemperatureMiredsAttributeFromDut_24();
            break;
        case 25:
            ChipLogProgress(
                chipTool, " ***** Test Step 25 : After another 2 seconds, TH reads ColorTemperatureMireds attribute from DUT.\n");
            if (ShouldSkip("CC.S.F04 && CC.S.A0007 && PICS_USER_PROMPT")) {
                NextTest();
                return;
            }
            err = TestAfterAnother2SecondsThReadsColorTemperatureMiredsAttributeFromDut_25();
            break;
        case 26:
            ChipLogProgress(chipTool,
                " ***** Test Step 26 : TH sends EnhancedMoveToHue command to DUT with EnhancedHue=20000, Direction=0x00 (shortest "
                "distance) and TransitionTime=0 (immediately).\n");
            if (ShouldSkip("CC.S.F01 && CC.S.C40.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsEnhancedMoveToHueCommandToDutWithEnhancedHue20000Direction0x00ShortestDistanceAndTransitionTime0Immediately_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : Wait 100ms\n");
            err = TestWait100ms_27();
            break;
        case 28:
            ChipLogProgress(chipTool,
                " ***** Test Step 28 : TH sends EnhancedMoveHue command to DUT with MoveMode=0x01 (up) and Rate=500 (units/s)\n");
            if (ShouldSkip("CC.S.F01 && CC.S.C41.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsEnhancedMoveHueCommandToDutWithMoveMode0x01UpAndRate500UnitsS_28();
            break;
        case 29:
            ChipLogProgress(chipTool, " ***** Test Step 29 : Wait 10s\n");
            err = TestWait10s_29();
            break;
        case 30:
            ChipLogProgress(chipTool, " ***** Test Step 30 : TH sends StopMoveStep command to DUT\n");
            if (ShouldSkip("CC.S.C47.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsStopMoveStepCommandToDut_30();
            break;
        case 31:
            ChipLogProgress(chipTool, " ***** Test Step 31 : TH reads EnhancedCurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.A4000 && CC.S.C47.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedCurrentHueAttributeFromDut_31();
            break;
        case 32:
            ChipLogProgress(chipTool, " ***** Test Step 32 : Wait 10s\n");
            err = TestWait10s_32();
            break;
        case 33:
            ChipLogProgress(chipTool, " ***** Test Step 33 : TH reads EnhancedCurrentHue attribute from DUT\n");
            if (ShouldSkip("CC.S.A4000 && CC.S.C47.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsEnhancedCurrentHueAttributeFromDut_33();
            break;
        case 34:
            ChipLogProgress(chipTool, " ***** Test Step 34 : Turn Off light that we turned on\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestTurnOffLightThatWeTurnedOn_34();
            break;
        case 35:
            ChipLogProgress(chipTool, " ***** Test Step 35 : Check on/off attribute value is false after off command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsFalseAfterOffCommand_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), 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;
        }

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

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

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 TestThWrites0ToTheOptionsAttribute_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                              completionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                   completionHandler:^(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");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                 completionHandler:^(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 TestThSendsStopMoveStepCommandToDut_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                      completionHandler:^(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 TestThReadsCurrentHueAttributeFromDut_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentHueWithCompletionHandler:^(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], 235U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentHue", [value unsignedCharValue], 254U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait2s_9()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 2000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentHueAttributeFromDut_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentHueWithCompletionHandler:^(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], 240U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentHue", [value unsignedCharValue], 254U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsMoveToSaturationCommandToDutWithSaturation150AndTransitionTime0Immediately_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                          completionHandler:^(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_12()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThSendsMoveSaturationCommandToDutWithMoveMode0x01UpAndRate5UnitsS_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                   completionHandler:^(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_14()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThSendsStopMoveStepCommandToDut_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                      completionHandler:^(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;
    }
    NSNumber * _Nonnull CurrentSaturationValue;

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletionHandler:^(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));
            {
                CurrentSaturationValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait2s_17()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 2000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentSaturationWithCompletionHandler:^(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], CurrentSaturationValue));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("currentSaturation", [value unsignedCharValue], 230U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull ColorTempPhysicalMinMireds;

    CHIP_ERROR TestThReadsColorTempPhysicalMinMiredsAttributeFromDut_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeColorTempPhysicalMinMiredsWithCompletionHandler:^(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));
                {
                    ColorTempPhysicalMinMireds = value;
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nonnull ColorTempPhysicalMaxMireds;

    CHIP_ERROR TestThReadsColorTempPhysicalMaxMiredsAttributeFromDut_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeColorTempPhysicalMaxMiredsWithCompletionHandler:^(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));
                {
                    ColorTempPhysicalMaxMireds = value;
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestThSendsMoveToColorTemperatureCommandToDutWithColorTemperatureMiredsColorTempPhysicalMaxMireds2AndTransitionTime0Immediately_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 TestThSendsMoveColorTemperatureCommandToDutWithMoveMode0x01UpRateColorTempPhysicalMaxMireds40_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 TestAfter10SecondsThSendsStopMoveStepCommandToDut_23()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("please enter 'y' for successgarbage: not 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 TestThReadsColorTemperatureMiredsAttributeFromDut_24()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("please enter 'y' for successgarbage: not 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 TestAfterAnother2SecondsThReadsColorTemperatureMiredsAttributeFromDut_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
    TestThSendsEnhancedMoveToHueCommandToDutWithEnhancedHue20000Direction0x00ShortestDistanceAndTransitionTime0Immediately_26()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterEnhancedMoveToHueParams alloc] init];
        params.enhancedHue = [NSNumber numberWithUnsignedShort:20000U];
        params.direction = [NSNumber numberWithUnsignedChar:0U];
        params.transitionTime = [NSNumber numberWithUnsignedShort:0U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster enhancedMoveToHueWithParams:params
                           completionHandler:^(NSError * _Nullable err) {
                               NSLog(@"TH sends EnhancedMoveToHue command to DUT with EnhancedHue=20000, 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_27()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 100UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThSendsEnhancedMoveHueCommandToDutWithMoveMode0x01UpAndRate500UnitsS_28()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRColorControlClusterEnhancedMoveHueParams alloc] init];
        params.moveMode = [NSNumber numberWithUnsignedChar:1U];
        params.rate = [NSNumber numberWithUnsignedShort:500U];
        params.optionsMask = [NSNumber numberWithUnsignedChar:0U];
        params.optionsOverride = [NSNumber numberWithUnsignedChar:0U];
        [cluster
            enhancedMoveHueWithParams:params
                    completionHandler:^(NSError * _Nullable err) {
                        NSLog(@"TH sends EnhancedMoveHue command to DUT with MoveMode=0x01 (up) and Rate=500 (units/s) Error: %@",
                            err);

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

                        NextTest();
                    }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_29()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThSendsStopMoveStepCommandToDut_30()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint: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
                      completionHandler:^(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;
    }
    NSNumber * _Nonnull EnhancedCurrentHueValue;

    CHIP_ERROR TestThReadsEnhancedCurrentHueAttributeFromDut_31()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedCurrentHueWithCompletionHandler:^(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], 23500U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 26500U));
            {
                EnhancedCurrentHueValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWait10s_32()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsEnhancedCurrentHueAttributeFromDut_33()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnhancedCurrentHueWithCompletionHandler:^(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], EnhancedCurrentHueValue));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("enhancedCurrentHue", [value unsignedShortValue], 26500U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestTurnOffLightThatWeTurnedOn_34()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletionHandler:^(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_35()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletionHandler:^(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_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++) {
        }

        if (CHIP_NO_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_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++) {
        }

        if (CHIP_NO_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_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");
        MTRBaseClusterDescriptor * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
                                                                                     endpoint:0
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletionHandler:^(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");
        MTRBaseClusterDescriptor * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
                                                                                     endpoint:0
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletionHandler:^(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");
        MTRBaseClusterDescriptor * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
                                                                                     endpoint:0
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterDescriptor * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
                                                                                     endpoint:0
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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");
        MTRBaseClusterDescriptor * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
                                                                                     endpoint:0
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletionHandler:^(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_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");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePHYRateWithCompletionHandler:^(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");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFullDuplexWithCompletionHandler:^(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");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePacketRxCountWithCompletionHandler:^(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");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePacketTxCountWithCompletionHandler:^(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");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTxErrCountWithCompletionHandler:^(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");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCollisionCountWithCompletionHandler:^(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");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOverrunCountWithCompletionHandler:^(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");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCarrierDetectWithCompletionHandler:^(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");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTimeSinceResetWithCompletionHandler:^(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");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePHYRateWithCompletionHandler:^(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");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePHYRateWithCompletionHandler:^(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");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePHYRateWithCompletionHandler:^(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");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePHYRateWithCompletionHandler:^(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");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePHYRateWithCompletionHandler:^(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");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePHYRateWithCompletionHandler:^(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");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePHYRateWithCompletionHandler:^(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");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePHYRateWithCompletionHandler:^(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");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePHYRateWithCompletionHandler:^(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");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePHYRateWithCompletionHandler:^(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");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePacketRxCountWithCompletionHandler:^(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");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePacketTxCountWithCompletionHandler:^(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");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTxErrCountWithCompletionHandler:^(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");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCollisionCountWithCompletionHandler:^(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");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOverrunCountWithCompletionHandler:^(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");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster resetCountsWithCompletionHandler:^(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");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePacketRxCountWithCompletionHandler:^(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");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePacketTxCountWithCompletionHandler:^(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");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTxErrCountWithCompletionHandler:^(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");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCollisionCountWithCompletionHandler:^(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");
        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOverrunCountWithCompletionHandler:^(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");
        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
                                                                                               endpoint:1
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletionHandler:^(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");
        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
                                                                                               endpoint:1
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletionHandler:^(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");
        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
                                                                                               endpoint:1
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
                                                                                               endpoint:1
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
                                                                                               endpoint:1
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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");
        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
                                                                                               endpoint:1
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletionHandler:^(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");
        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
                                                                                               endpoint:1
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinMeasuredValueWithCompletionHandler:^(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");
        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
                                                                                               endpoint:1
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxMeasuredValueWithCompletionHandler:^(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");
        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
                                                                                               endpoint:1
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMeasuredValueWithCompletionHandler:^(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");
        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
                                                                                               endpoint:1
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeToleranceWithCompletionHandler:^(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_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");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                         endpoint:0
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletionHandler:^(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");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                         endpoint:0
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletionHandler:^(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");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                         endpoint:0
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                         endpoint:0
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                         endpoint:0
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletionHandler:^(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");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                         endpoint:0
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBreadcrumbWithCompletionHandler:^(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");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                         endpoint:0
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id breadcrumbArgument;
        breadcrumbArgument = [NSNumber numberWithUnsignedLongLong:1ULL];
        [cluster writeAttributeBreadcrumbWithValue:breadcrumbArgument
                                 completionHandler:^(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");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                         endpoint:0
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBreadcrumbWithCompletionHandler:^(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");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                         endpoint:0
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRegulatoryConfigWithCompletionHandler:^(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");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                         endpoint:0
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLocationCapabilityWithCompletionHandler:^(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");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                         endpoint:0
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBasicCommissioningInfoWithCompletionHandler:^(
            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");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                         endpoint:0
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

        [cluster readAttributeAttributeListWithCompletionHandler:^(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, 65533UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
                                                                                                     endpoint:0
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

        [cluster readAttributeGeneratedCommandListWithCompletionHandler:^(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;
        }

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

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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 TestThReadsNetworkInterfacesStructureAttributeFromDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
                                                                                                     endpoint:0
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

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

        [cluster readAttributeBootReasonsWithCompletionHandler:^(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);
    }
};

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");
            if (ShouldSkip(" !I.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("I.S.F00")) {
                NextTest();
                return;
            }
            err = TestThReadsTheFeatureMapAttributeFromTheDut_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 global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read the optional command(TriggerEffect) in AcceptedCommandList\n");
            if (ShouldSkip("I.C.C40.Tx")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandTriggerEffectInAcceptedCommandList_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read the optional attribute(IdentifyQuery) in AcceptedCommandList\n");
            if (ShouldSkip("I.C.C01.Tx")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeIdentifyQueryInAcceptedCommandList_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_8();
            break;
        case 9:
            ChipLogProgress(
                chipTool, " ***** Test Step 9 : Read the optional attribute(IdentifyQueryResponse) in GeneratedCommandList\n");
            if (ShouldSkip("I.S.C00.Tx")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeIdentifyQueryResponseInGeneratedCommandList_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 TestThReadsTheClusterRevisionAttributeFromTheDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletionHandler:^(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");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletionHandler:^(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 TestThReadsTheFeatureMapAttributeFromTheDut_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletionHandler:^(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 TestReadTheGlobalAttributeAttributeList_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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 TestReadTheOptionalAttributeIdentifyQueryInAcceptedCommandList_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(IdentifyQuery) 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 TestReadTheGlobalAttributeGeneratedCommandList_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletionHandler:^(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 TestReadTheOptionalAttributeIdentifyQueryResponseInGeneratedCommandList_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletionHandler:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optional attribute(IdentifyQueryResponse) in GeneratedCommandList 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], 0UL));
            }

            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");
            err = TestThReadsTheIdentifyTimeAttributeFromTheDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : TH reads the IdentifyType attribute from the DUT\n");
            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");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeIdentifyTimeWithCompletionHandler:^(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");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeIdentifyTypeWithCompletionHandler:^(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 identify time 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 identify time 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 sends IdentifyQuery command to DUT \n");
            if (ShouldSkip("PICS_USER_PROMPT && I.S.C01.Rsp && I.S.C00.Tx")) {
                NextTest();
                return;
            }
            err = TestThSendsIdentifyQueryCommandToDut_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH writes a value of 0x000f (15s) to IdentifyTime attribute of DUT\n");
            if (ShouldSkip("I.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThWritesAValueOf0x000f15sToIdentifyTimeAttributeOfDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Wait 5000ms\n");
            err = TestWait5000ms_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : After 5 seconds, the TH reads IdentifyTime attribute from DUT\n");
            if (ShouldSkip("I.S.A0000")) {
                NextTest();
                return;
            }
            err = TestAfter5SecondsTheThReadsIdentifyTimeAttributeFromDut_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 TestThSendsIdentifyCommandToDutWithTheIdentifyTimeFieldSetTo0x003c60s_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRIdentifyClusterIdentifyParams alloc] init];
        params.identifyTime = [NSNumber numberWithUnsignedShort:60U];
        [cluster identifyWithParams:params
                  completionHandler:^(NSError * _Nullable err) {
                      NSLog(@"TH sends Identify command to DUT, with the identify time 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");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeIdentifyTimeWithCompletionHandler:^(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");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeIdentifyTimeWithCompletionHandler:^(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], 43U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("identifyTime", [value unsignedShortValue], 57U));

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

        __auto_type * params = [[MTRIdentifyClusterIdentifyParams alloc] init];
        params.identifyTime = [NSNumber numberWithUnsignedShort:0U];
        [cluster
            identifyWithParams:params
             completionHandler:^(NSError * _Nullable err) {
                 NSLog(
                     @"TH sends Identify command to DUT, with the identify time 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");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeIdentifyTimeWithCompletionHandler:^(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("identify time", actualValue, 0U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThSendsIdentifyQueryCommandToDut_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 TestThWritesAValueOf0x000f15sToIdentifyTimeAttributeOfDut_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id identifyTimeArgument;
        identifyTimeArgument = [NSNumber numberWithUnsignedShort:15U];
        [cluster writeAttributeIdentifyTimeWithValue:identifyTimeArgument
                                   completionHandler:^(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_10()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 5000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestAfter5SecondsTheThReadsIdentifyTimeAttributeFromDut_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeIdentifyTimeWithCompletionHandler:^(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");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpoint: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
                       completionHandler:^(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");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpoint: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
                       completionHandler:^(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");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpoint: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
                       completionHandler:^(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");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpoint: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
                       completionHandler:^(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");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpoint: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
                       completionHandler:^(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");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpoint: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
                       completionHandler:^(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");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpoint: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
                       completionHandler:^(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");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpoint: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
                       completionHandler:^(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");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpoint: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
                       completionHandler:^(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");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpoint: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
                       completionHandler:^(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");
        MTRBaseClusterIlluminanceMeasurement * cluster =
            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletionHandler:^(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");
        MTRBaseClusterIlluminanceMeasurement * cluster =
            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletionHandler:^(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");
        MTRBaseClusterIlluminanceMeasurement * cluster =
            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterIlluminanceMeasurement * cluster =
            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterIlluminanceMeasurement * cluster =
            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterIlluminanceMeasurement * cluster =
            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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");
        MTRBaseClusterIlluminanceMeasurement * cluster =
            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletionHandler:^(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");
        MTRBaseClusterIlluminanceMeasurement * cluster =
            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinMeasuredValueWithCompletionHandler:^(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");
        MTRBaseClusterIlluminanceMeasurement * cluster =
            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxMeasuredValueWithCompletionHandler:^(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");
        MTRBaseClusterIlluminanceMeasurement * cluster =
            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMeasuredValueWithCompletionHandler:^(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");
        MTRBaseClusterIlluminanceMeasurement * cluster =
            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeToleranceWithCompletionHandler:^(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");
        MTRBaseClusterIlluminanceMeasurement * cluster =
            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLightSensorTypeWithCompletionHandler:^(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_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 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_3();
            break;
        case 4:
            ChipLogProgress(chipTool,
                " ***** Test Step 4 : Read the optonal attribute(StartUpCurrentLevel and RemainingTime) in AttributeList\n");
            if (ShouldSkip("LVL.S.F01")) {
                NextTest();
                return;
            }
            err = TestReadTheOptonalAttributeStartUpCurrentLevelAndRemainingTimeInAttributeList_4();
            break;
        case 5:
            ChipLogProgress(chipTool,
                " ***** Test Step 5 : Read the optonal attribute(CurrentFrequency, MinFrequency and MinFrequency) in "
                "AttributeList\n");
            if (ShouldSkip("LVL.S.F02")) {
                NextTest();
                return;
            }
            err = TestReadTheOptonalAttributeCurrentFrequencyMinFrequencyAndMinFrequencyInAttributeList_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read the optonal attribute(MinLevel) in AttributeList\n");
            if (ShouldSkip("LVL.S.A0002")) {
                NextTest();
                return;
            }
            err = TestReadTheOptonalAttributeMinLevelInAttributeList_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read the optonal attribute(MaxLevel) in AttributeList\n");
            if (ShouldSkip("LVL.S.A0003")) {
                NextTest();
                return;
            }
            err = TestReadTheOptonalAttributeMaxLevelInAttributeList_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read the optonal attribute(OnOffTransitionTime) in AttributeList\n");
            if (ShouldSkip("LVL.S.A0010")) {
                NextTest();
                return;
            }
            err = TestReadTheOptonalAttributeOnOffTransitionTimeInAttributeList_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Read the optonal attribute(OnTransitionTime) in AttributeList\n");
            if (ShouldSkip("LVL.S.A0012")) {
                NextTest();
                return;
            }
            err = TestReadTheOptonalAttributeOnTransitionTimeInAttributeList_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Read the optonal attribute(OffTransitionTime) in AttributeList\n");
            if (ShouldSkip("LVL.S.A0013")) {
                NextTest();
                return;
            }
            err = TestReadTheOptonalAttributeOffTransitionTimeInAttributeList_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Read the optonal attribute(DefaultMoveRate) in AttributeList\n");
            if (ShouldSkip("LVL.S.A0014")) {
                NextTest();
                return;
            }
            err = TestReadTheOptonalAttributeDefaultMoveRateInAttributeList_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 Feature-dependent(LVL.S.F02) attribute in AcceptedCommandList\n");
            if (ShouldSkip("LVL.S.F02")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentLVLSF02AttributeInAcceptedCommandList_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_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 TestReadTheGlobalAttributeClusterRevision_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletionHandler:^(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], 7UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheOptonalAttributeStartUpCurrentLevelAndRemainingTimeInAttributeList_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optonal 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 TestReadTheOptonalAttributeCurrentFrequencyMinFrequencyAndMinFrequencyInAttributeList_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optonal 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 TestReadTheOptonalAttributeMinLevelInAttributeList_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optonal 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 TestReadTheOptonalAttributeMaxLevelInAttributeList_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optonal 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 TestReadTheOptonalAttributeOnOffTransitionTimeInAttributeList_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optonal 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 TestReadTheOptonalAttributeOnTransitionTimeInAttributeList_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optonal 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 TestReadTheOptonalAttributeOffTransitionTimeInAttributeList_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optonal 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 TestReadTheOptonalAttributeDefaultMoveRateInAttributeList_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the optonal 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_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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 TestReadTheFeatureDependentLVLSF02AttributeInAcceptedCommandList_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read the Feature-dependent(LVL.S.F02) attribute 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_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRemainingTimeWithCompletionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinLevelWithCompletionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinLevelWithCompletionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxLevelWithCompletionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxLevelWithCompletionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentFrequencyWithCompletionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinFrequencyWithCompletionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxFrequencyWithCompletionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentFrequencyWithCompletionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffTransitionTimeWithCompletionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnLevelWithCompletionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnLevelWithCompletionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnTransitionTimeWithCompletionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOffTransitionTimeWithCompletionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeDefaultMoveRateWithCompletionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOptionsWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads the Options attribute  Error: %@", err);

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

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("Options", actualValue, 0U));
            }

            VerifyOrReturn(CheckConstraintType("options", "bitmap8", "bitmap8"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsTheStartUpCurrentLevelAttribute_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeStartUpCurrentLevelWithCompletionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffTransitionTimeWithCompletionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint: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
                                          completionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffTransitionTimeWithCompletionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnLevelWithCompletionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint: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
                              completionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnLevelWithCompletionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnTransitionTimeWithCompletionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint: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
                                       completionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnTransitionTimeWithCompletionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOffTransitionTimeWithCompletionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint: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
                                        completionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOffTransitionTimeWithCompletionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeDefaultMoveRateWithCompletionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint: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
                                      completionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeDefaultMoveRateWithCompletionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeStartUpCurrentLevelWithCompletionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint: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
                                          completionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeStartUpCurrentLevelWithCompletionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id onOffTransitionTimeArgument;
        onOffTransitionTimeArgument = [NSNumber numberWithUnsignedShort:0U];
        [cluster writeAttributeOnOffTransitionTimeWithValue:onOffTransitionTimeArgument
                                          completionHandler:^(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 : TH writes 0 to the Options attribute\n");
            if (ShouldSkip("LVL.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThWrites0ToTheOptionsAttribute_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH sends Off command to DUT\n");
            if (ShouldSkip("LVL.S.C04.Rsp && OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOffCommandToDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool,
                " ***** Test Step 5 : 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_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : TH reads OnOff attribute (On/Off cluster) from DUT\n");
            if (ShouldSkip("OO.S.A0000 && LVL.S.C04.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsOnOffAttributeOnOffClusterFromDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C04.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : TH sends On command to DUT\n");
            if (ShouldSkip("LVL.S.C04.Rsp && 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 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool,
                " ***** Test Step 11 : TH sends a MoveToLevel command to the DUT with Level = 200 and TransitionTime = 300 (30 s). "
                "This means the level should increase by 150 units in 30s, so 5 units/s\n");
            if (ShouldSkip("LVL.S.C00.Rsp && LVL.S.M.VarRate")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveToLevelCommandToTheDutWithLevel200AndTransitionTime30030SThisMeansTheLevelShouldIncreaseBy150UnitsIn30sSo5UnitsS_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Wait 10000ms\n");
            err = TestWait10000ms_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000 && LVL.S.M.VarRate")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Wait 10000ms\n");
            err = TestWait10000ms_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000 && LVL.S.M.VarRate")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Wait 10000ms\n");
            err = TestWait10000ms_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C00.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.C00.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\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 writes 0 to the Options attribute\n");
            if (ShouldSkip("LVL.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThWrites0ToTheOptionsAttribute_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : TH reads Options attribute\n");
            if (ShouldSkip("LVL.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionsAttribute_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : TH sends On command to DUT\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : TH sends a MoveToLevel command to the DUT with\n");
            if (ShouldSkip("LVL.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveToLevelCommandToTheDutWith_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_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 : TH sends a MoveToLevel command to the DUT with\n");
            if (ShouldSkip("LVL.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveToLevelCommandToTheDutWith_27();
            break;
        case 28:
            ChipLogProgress(chipTool, " ***** Test Step 28 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_28();
            break;
        case 29:
            ChipLogProgress(chipTool, " ***** Test Step 29 : TH sends a MoveToLevel command to the DUT with\n");
            if (ShouldSkip("LVL.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveToLevelCommandToTheDutWith_29();
            break;
        case 30:
            ChipLogProgress(chipTool, " ***** Test Step 30 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_30();
            break;
        case 31:
            ChipLogProgress(chipTool, " ***** Test Step 31 : TH sends a MoveToLevel command to the DUT with\n");
            if (ShouldSkip("LVL.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveToLevelCommandToTheDutWith_31();
            break;
        case 32:
            ChipLogProgress(chipTool, " ***** Test Step 32 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_32();
            break;
        case 33:
            ChipLogProgress(chipTool, " ***** Test Step 33 : TH writes 1 to the Options attribute\n");
            if (ShouldSkip("LVL.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThWrites1ToTheOptionsAttribute_33();
            break;
        case 34:
            ChipLogProgress(chipTool, " ***** Test Step 34 : TH reads Options attribute\n");
            if (ShouldSkip("LVL.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionsAttribute_34();
            break;
        case 35:
            ChipLogProgress(chipTool, " ***** Test Step 35 : TH sends On command to DUT\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_35();
            break;
        case 36:
            ChipLogProgress(chipTool, " ***** Test Step 36 : TH sends a MoveToLevel command to the DUT with\n");
            if (ShouldSkip("LVL.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveToLevelCommandToTheDutWith_36();
            break;
        case 37:
            ChipLogProgress(chipTool, " ***** Test Step 37 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_37();
            break;
        case 38:
            ChipLogProgress(chipTool, " ***** Test Step 38 : TH sends Off command to DUT\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOffCommandToDut_38();
            break;
        case 39:
            ChipLogProgress(chipTool, " ***** Test Step 39 : TH sends a MoveToLevel command to the DUT with\n");
            if (ShouldSkip("LVL.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveToLevelCommandToTheDutWith_39();
            break;
        case 40:
            ChipLogProgress(chipTool, " ***** Test Step 40 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_40();
            break;
        case 41:
            ChipLogProgress(chipTool, " ***** Test Step 41 : TH sends a MoveToLevel command to the DUT with\n");
            if (ShouldSkip("LVL.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveToLevelCommandToTheDutWith_41();
            break;
        case 42:
            ChipLogProgress(chipTool, " ***** Test Step 42 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_42();
            break;
        case 43:
            ChipLogProgress(chipTool, " ***** Test Step 43 : TH sends a MoveToLevel command to the DUT with\n");
            if (ShouldSkip("LVL.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveToLevelCommandToTheDutWith_43();
            break;
        case 44:
            ChipLogProgress(chipTool, " ***** Test Step 44 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_44();
            break;
        case 45:
            ChipLogProgress(chipTool, " ***** Test Step 45 : Precondition send Off Command\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestPreconditionSendOffCommand_45();
            break;
        case 46:
            ChipLogProgress(chipTool, " ***** Test Step 46 : Check on/off attribute value is false after off command\n");
            if (ShouldSkip("OO.S.A0000")) {
                NextTest();
                return;
            }
            err = TestCheckOnOffAttributeValueIsFalseAfterOffCommand_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 TestPreconditionSendOnCommand_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletionHandler:^(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 TestThWrites0ToTheOptionsAttribute_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                              completionHandler:^(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_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletionHandler:^(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_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint: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
                              completionHandler:^(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_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletionHandler:^(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_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletionHandler:^(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_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint: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
                     completionHandler:^(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_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletionHandler:^(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_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint: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
                     completionHandler:^(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_12()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletionHandler:^(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_14()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletionHandler:^(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_16()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletionHandler:^(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_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletionHandler:^(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_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                              completionHandler:^(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_22()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOptionsWithCompletionHandler:^(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_23()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletionHandler:^(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_24()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint: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
                     completionHandler:^(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_25()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletionHandler:^(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_26()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletionHandler:^(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_27()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint: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
                     completionHandler:^(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_28()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletionHandler:^(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_29()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint: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
                     completionHandler:^(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_30()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletionHandler:^(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_31()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint: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
                     completionHandler:^(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_32()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletionHandler:^(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_33()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:1U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                              completionHandler:^(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_34()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOptionsWithCompletionHandler:^(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_35()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletionHandler:^(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_36()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint: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
                     completionHandler:^(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_37()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletionHandler:^(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_38()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletionHandler:^(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_39()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint: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
                     completionHandler:^(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_40()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletionHandler:^(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_41()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint: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
                     completionHandler:^(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_42()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletionHandler:^(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_43()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint: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
                     completionHandler:^(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_44()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletionHandler:^(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 TestPreconditionSendOffCommand_45()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletionHandler:^(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_46()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletionHandler:^(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_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 : TH writes 0 to the Options attribute\n");
            if (ShouldSkip("LVL.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThWrites0ToTheOptionsAttribute_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH reads the MaxLevel attribute from the DUT\n");
            if (ShouldSkip("LVL.S.A0003")) {
                NextTest();
                return;
            }
            err = TestThReadsTheMaxLevelAttributeFromTheDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH sends Off command to DUT\n");
            if (ShouldSkip("OO.S.C00.Rsp && LVL.S.C05.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOffCommandToDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool,
                " ***** Test Step 6 : 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_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.C05.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.C05.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Wait 5000ms\n");
            err = TestWait5000ms_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C05.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : TH sends On command to DUT\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool,
                " ***** Test Step 12 : 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_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C00.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool,
                " ***** Test Step 14 : 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_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 CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C01.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_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 CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C01.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_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 CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C01.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Wait 13s\n");
            err = TestWait13s_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C01.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : Precondition send Off Command\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestPreconditionSendOffCommand_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 TestPreconditionSendOnCommand_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletionHandler:^(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 TestThWrites0ToTheOptionsAttribute_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                              completionHandler:^(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_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxLevelWithCompletionHandler:^(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_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletionHandler:^(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_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint: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
                  completionHandler:^(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_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletionHandler:^(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_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletionHandler:^(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_9()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 5000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletionHandler:^(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_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletionHandler:^(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_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint: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
                     completionHandler:^(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_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletionHandler:^(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_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint: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
              completionHandler:^(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_15()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletionHandler:^(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_17()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletionHandler:^(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_19()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletionHandler:^(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 TestWait13s_21()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 13000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_22()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletionHandler:^(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_23()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletionHandler:^(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_24()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletionHandler:^(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 : TH writes 0 to the Options attribute\n");
            if (ShouldSkip("LVL.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThWrites0ToTheOptionsAttribute_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH sends Off command to DUT\n");
            if (ShouldSkip("OO.S.C00.Rsp && LVL.S.C06.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOffCommandToDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool,
                " ***** Test Step 5 : 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_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : TH reads OnOff attribute (On/Off cluster) from DUT\n");
            if (ShouldSkip("OO.S.A0000 && LVL.S.C06.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsOnOffAttributeOnOffClusterFromDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH sends On command to DUT\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_7();
            break;
        case 8:
            ChipLogProgress(chipTool,
                " ***** Test Step 8 : 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_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Reads current level attribute from DUT\n");
            if (ShouldSkip("LVL.S.A0000 && LVL.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsCurrentLevelAttributeFromDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool,
                " ***** Test Step 10 : TH sends a Step command to the DUT with StepMode =0x00 (up), StepSize =150 and "
                "TransitionTime =300\n");
            if (ShouldSkip("LVL.S.C02.Rsp && LVL.S.M.VarRate")) {
                NextTest();
                return;
            }
            err = TestThSendsAStepCommandToTheDutWithStepMode0x00UpStepSize150AndTransitionTime300_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 CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C02.Rsp && LVL.S.A0000 && LVL.S.M.VarRate")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_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 CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C02.Rsp && LVL.S.A0000 && LVL.S.M.VarRate")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_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 CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C02.Rsp && LVL.S.A0000 && LVL.S.M.VarRate")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Wait 5000ms\n");
            err = TestWait5000ms_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C02.Rsp && LVL.S.A0000 && LVL.S.M.VarRate")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_18();
            break;
        case 19:
            ChipLogProgress(chipTool,
                " ***** Test Step 19 : 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_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Precondition send Off Command\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestPreconditionSendOffCommand_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 TestPreconditionSendOnCommand_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletionHandler:^(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 TestThWrites0ToTheOptionsAttribute_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                              completionHandler:^(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_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletionHandler:^(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_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint: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
                       completionHandler:^(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_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletionHandler:^(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_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletionHandler:^(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_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint: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
                     completionHandler:^(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_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletionHandler:^(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_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint: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
            completionHandler:^(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_11()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletionHandler:^(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_13()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletionHandler:^(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_15()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletionHandler:^(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_17()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 5000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletionHandler:^(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_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletionHandler:^(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_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletionHandler:^(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_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletionHandler:^(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 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 : TH writes 0 to the Options attribute\n");
            if (ShouldSkip("LVL.S.A000f")) {
                NextTest();
                return;
            }
            err = TestThWrites0ToTheOptionsAttribute_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH sends On command to DUT\n");
            if (ShouldSkip("OO.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsOnCommandToDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool,
                " ***** Test Step 5 : 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_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.A0000 && LVL.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool,
                " ***** Test Step 7 : TH sends a Move command to the DUT, with the MoveMode field set to 0x00 (move up) and the "
                "Rate field set to 0x05 (5 units/s)\n");
            if (ShouldSkip("LVL.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveCommandToTheDutWithTheMoveModeFieldSetTo0x00MoveUpAndTheRateFieldSetTo0x055UnitsS_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Wait 5000ms\n");
            err = TestWait5000ms_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 : Sends stop command to DUT\n");
            if (ShouldSkip("LVL.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsStopCommandToDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : TH reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C01.Rsp && LVL.S.C03.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsCurrentLevelAttributeFromDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool,
                " ***** Test Step 12 : TH sends a Move command to the DUT, with the MoveMode field set to 0x00 (move up) and the "
                "Rate field set to 0x05 (5 units/s)\n");
            if (ShouldSkip("LVL.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAMoveCommandToTheDutWithTheMoveModeFieldSetTo0x00MoveUpAndTheRateFieldSetTo0x055UnitsS_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Wait 5000ms\n");
            err = TestWait5000ms_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : TH sends a StopWithOnOff command to the DUT\n");
            if (ShouldSkip("LVL.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsAStopWithOnOffCommandToTheDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Physically verify that the device has stopped transitioning\n");
            if (ShouldSkip("PICS_USER_PROMPT && LVL.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestPhysicallyVerifyThatTheDeviceHasStoppedTransitioning_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Reads CurrentLevel attribute from DUT\n");
            if (ShouldSkip("LVL.S.C01.Rsp && LVL.S.C07.Rsp && LVL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadsCurrentLevelAttributeFromDut_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Precondition send Off Command\n");
            if (ShouldSkip("OO.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestPreconditionSendOffCommand_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 TestPreconditionSendOnCommand_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletionHandler:^(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 TestThWrites0ToTheOptionsAttribute_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id optionsArgument;
        optionsArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOptionsWithValue:optionsArgument
                              completionHandler:^(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_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletionHandler:^(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_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint: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
                     completionHandler:^(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_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletionHandler:^(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_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint: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
              completionHandler:^(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_8()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 5000UL;
        return WaitForMs("alpha", value);
    }

    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 TestSendsStopCommandToDut_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint: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
              completionHandler:^(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 TestThReadsCurrentLevelAttributeFromDut_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletionHandler:^(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_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint: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
              completionHandler:^(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_13()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 5000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThSendsAStopWithOnOffCommandToTheDut_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint: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
                       completionHandler:^(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_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 TestReadsCurrentLevelAttributeFromDut_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletionHandler:^(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_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletionHandler:^(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_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletionHandler:^(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_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");
        MTRBaseClusterLowPower * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletionHandler:^(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");
        MTRBaseClusterLowPower * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletionHandler:^(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");
        MTRBaseClusterLowPower * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterLowPower * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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");
        MTRBaseClusterLowPower * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletionHandler:^(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 : 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");
        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletionHandler:^(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");
        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletionHandler:^(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], 7UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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");
        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

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

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

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

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

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

        [cluster readAttributeGeneratedCommandListWithCompletionHandler:^(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");
            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(InputList) in AttributeList\n");
            if (ShouldSkip("MEDIAINPUT.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeInputListInAttributeList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the optional attribute(CurrentInput) in AttributeList\n");
            if (ShouldSkip("MEDIAINPUT.S.A0001")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeCurrentInputInAttributeList_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");
        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletionHandler:^(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");
        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletionHandler:^(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], 1UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletionHandler:^(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");
        MTRBaseClusterWakeOnLan * cluster = [[MTRBaseClusterWakeOnLan alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletionHandler:^(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");
        MTRBaseClusterWakeOnLan * cluster = [[MTRBaseClusterWakeOnLan alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletionHandler:^(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");
        MTRBaseClusterWakeOnLan * cluster = [[MTRBaseClusterWakeOnLan alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterWakeOnLan * cluster = [[MTRBaseClusterWakeOnLan alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterWakeOnLan * cluster = [[MTRBaseClusterWakeOnLan alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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");
        MTRBaseClusterWakeOnLan * cluster = [[MTRBaseClusterWakeOnLan alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletionHandler:^(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 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the optional attribute(ChannelList): AttributeList\n");
            if (ShouldSkip("CHANNEL.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeChannelListAttributeList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Reading optional attribute(Lineup) in AttributeList\n");
            if (ShouldSkip("CHANNEL.S.A0001")) {
                NextTest();
                return;
            }
            err = TestReadingOptionalAttributeLineupInAttributeList_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read the optional attribute(CurrentChannel): AttributeList\n");
            if (ShouldSkip("CHANNEL.S.A0002")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeCurrentChannelAttributeList_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read the optional command(ChangeChannel) in AcceptedCommandList\n");
            if (ShouldSkip("CHANNEL.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandChangeChannelInAcceptedCommandList_7();
            break;
        case 8:
            ChipLogProgress(
                chipTool, " ***** Test Step 8 : Read the optional command(ChangeChannelByNumber) in AcceptedCommandList\n");
            if (ShouldSkip("CHANNEL.S.C02.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandChangeChannelByNumberInAcceptedCommandList_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Read the optional command(SkipChannel) in AcceptedCommandList\n");
            if (ShouldSkip("CHANNEL.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandSkipChannelInAcceptedCommandList_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Read the global attribute: GeneratedCommandList\n");
            if (ShouldSkip("CHANNEL.S.CL || CHANNEL.S.LI")) {
                NextTest();
                return;
            }
            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");
        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletionHandler:^(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 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the optional attribute(StartTime) in AttributeList\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0001")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeStartTimeInAttributeList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the optional attribute(Duration) in AttributeList\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0002")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeDurationInAttributeList_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read the optional attribute(SampledPosition) in AttributeList\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0003")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeSampledPositionInAttributeList_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Read the optional attribute(PlaybackSpeed) in AttributeList\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0004")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributePlaybackSpeedInAttributeList_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read the optional attribute(SeekRangeEnd) in AttributeList\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0005")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeSeekRangeEndInAttributeList_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Read the optional attribute(SeekRangeStart) in AttributeList\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0006")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeSeekRangeStartInAttributeList_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 optional command(StartOver) in AcceptedCommandList\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandStartOverInAcceptedCommandList_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Read the optional command(Previous) in AcceptedCommandList\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C04.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandPreviousInAcceptedCommandList_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Read the optional command(Next) in AcceptedCommandList\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C05.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandNextInAcceptedCommandList_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Read the optional command(Rewind) in AcceptedCommandList\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C06.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandRewindInAcceptedCommandList_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Read the optional command(FastForward) in AcceptedCommandList\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandFastForwardInAcceptedCommandList_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Read the optional command(SkipForward) in AcceptedCommandList\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C08.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandSkipForwardInAcceptedCommandList_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Read the optional command(SkipBackward) in AcceptedCommandList\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C09.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandSkipBackwardInAcceptedCommandList_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Read the optional command(Seek) in AcceptedCommandList\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C0B.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandSeekInAcceptedCommandList_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_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 TestReadTheGlobalAttributeClusterRevision_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                           endpoint:1
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                           endpoint:1
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                           endpoint:1
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                           endpoint:1
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                           endpoint:1
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                           endpoint:1
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                           endpoint:1
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                           endpoint:1
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                           endpoint:1
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                           endpoint:1
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                           endpoint:1
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                           endpoint:1
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                           endpoint:1
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                           endpoint:1
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                           endpoint:1
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                           endpoint:1
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                           endpoint:1
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletionHandler:^(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");
            if (ShouldSkip("MEDIAINPUT.S.NU")) {
                NextTest();
                return;
            }
            err = TestReadTheGlobalAttributeGeneratedCommandList_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Read the global attribute: GeneratedCommandList\n");
            if (ShouldSkip(" !MEDIAINPUT.S.NU ")) {
                NextTest();
                return;
            }
            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");
        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletionHandler:^(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");
        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletionHandler:^(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");
        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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");
        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletionHandler:^(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>(1)));
                VerifyOrReturn(CheckValue("", actualValue[0], 1UL));
            }

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

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletionHandler:^(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");
        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
                                                                                               endpoint:1
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletionHandler:^(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");
        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
                                                                                               endpoint:1
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletionHandler:^(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");
        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
                                                                                               endpoint:1
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
                                                                                               endpoint:1
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
                                                                                               endpoint:1
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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");
        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
                                                                                               endpoint:1
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

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

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

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

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

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

        [cluster readAttributeGeneratedCommandListWithCompletionHandler:^(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 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Read the optional attribute(AcceptHeader): AttributeList\n");
            if (ShouldSkip("CONTENTLAUNCHER.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeAcceptHeaderAttributeList_4();
            break;
        case 5:
            ChipLogProgress(
                chipTool, " ***** Test Step 5 : Read the optional attribute(SupportedStreamingProtocols): AttributeList\n");
            if (ShouldSkip("CONTENTLAUNCHER.S.A0001")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalAttributeSupportedStreamingProtocolsAttributeList_5();
            break;
        case 6:
            ChipLogProgress(
                chipTool, " ***** Test Step 6 : Read the optional command(LaunchContent) in AcceptedCommandList attribute\n");
            if (ShouldSkip("CONTENTLAUNCHER.C.C0000")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandLaunchContentInAcceptedCommandListAttribute_6();
            break;
        case 7:
            ChipLogProgress(
                chipTool, " ***** Test Step 7 : Read the optional command(LaunchURL) in AcceptedCommandList attribute\n");
            if (ShouldSkip("CONTENTLAUNCHER.C.C0001")) {
                NextTest();
                return;
            }
            err = TestReadTheOptionalCommandLaunchURLInAcceptedCommandListAttribute_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");
        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
                                                                                               endpoint:1
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletionHandler:^(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");
        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
                                                                                               endpoint:1
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletionHandler:^(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");
        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
                                                                                               endpoint:1
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
                                                                                               endpoint:1
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
                                                                                               endpoint:1
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
                                                                                               endpoint:1
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
                                                                                               endpoint:1
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
                                                                                               endpoint:1
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletionHandler:^(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");
        MTRBaseClusterAccountLogin * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
                                                                                         endpoint:3
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletionHandler:^(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");
        MTRBaseClusterAccountLogin * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
                                                                                         endpoint:3
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletionHandler:^(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");
        MTRBaseClusterAccountLogin * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
                                                                                         endpoint:3
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterAccountLogin * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
                                                                                         endpoint:3
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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");
        MTRBaseClusterAccountLogin * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
                                                                                         endpoint:3
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletionHandler:^(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_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");
        MTRBaseClusterLowPower * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster sleepWithCompletionHandler:^(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")) {
                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")) {
                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");
        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
        params.keyCode = [NSNumber numberWithUnsignedChar:10U];
        [cluster sendKeyWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
        params.keyCode = [NSNumber numberWithUnsignedChar:9U];
        [cluster sendKeyWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
        params.keyCode = [NSNumber numberWithUnsignedChar:33U];
        [cluster sendKeyWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
        params.keyCode = [NSNumber numberWithUnsignedChar:34U];
        [cluster sendKeyWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
        params.keyCode = [NSNumber numberWithUnsignedChar:35U];
        [cluster sendKeyWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
        params.keyCode = [NSNumber numberWithUnsignedChar:36U];
        [cluster sendKeyWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
        params.keyCode = [NSNumber numberWithUnsignedChar:37U];
        [cluster sendKeyWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
        params.keyCode = [NSNumber numberWithUnsignedChar:38U];
        [cluster sendKeyWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
        params.keyCode = [NSNumber numberWithUnsignedChar:39U];
        [cluster sendKeyWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
        params.keyCode = [NSNumber numberWithUnsignedChar:40U];
        [cluster sendKeyWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
        params.keyCode = [NSNumber numberWithUnsignedChar:41U];
        [cluster sendKeyWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
                                                                                                       endpoint:1
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

        [cluster readAttributeCurrentAppWithCompletionHandler:^(
            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");
        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInputListWithCompletionHandler:^(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");
        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInputListWithCompletionHandler:^(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");
        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRMediaInputClusterSelectInputParams alloc] init];
        params.index = [NSNumber numberWithUnsignedChar:1U];
        [cluster selectInputWithParams:params
                     completionHandler:^(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");
        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentInputWithCompletionHandler:^(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");
        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInputListWithCompletionHandler:^(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");
        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster showInputStatusWithCompletionHandler:^(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");
        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster hideInputStatusWithCompletionHandler:^(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 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 : 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
    TestThReadsTheInputListAttributeFromTheDutToShowListOfInputsAvailableAndVerifyListOfAvailableInputsSupportedByTheDeviceIsProvidedWhereEachEntryInTheListContainsAnIndextypeuint8InputTypeInputTypeEnumsNameTypeStringsAndDescriptionTypeString_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInputListWithCompletionHandler:^(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 TestRenameInputCommand_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
                                                                                     endpoint: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
                     completionHandler:^(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_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");
        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

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

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

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

        __auto_type * params = [[MTRChannelClusterSkipChannelParams alloc] init];
        params.count = [NSNumber numberWithUnsignedShort:1U];
        [cluster skipChannelWithParams:params
                     completionHandler:^(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");
        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        __auto_type * params = [[MTRMediaPlaybackClusterSkipForwardParams alloc] init];
        params.deltaPositionMilliseconds = [NSNumber numberWithUnsignedLongLong:10000ULL];
        [cluster
            skipForwardWithParams:params
                completionHandler:^(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");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                           endpoint:1
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

        __auto_type * params = [[MTRMediaPlaybackClusterSkipBackwardParams alloc] init];
        params.deltaPositionMilliseconds = [NSNumber numberWithUnsignedLongLong:10000ULL];
        [cluster
            skipBackwardWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                           endpoint:1
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSampledPositionWithCompletionHandler:^(
            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;
        }

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

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 4:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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<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");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                           endpoint:1
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

        __auto_type * params = [[MTRMediaPlaybackClusterSeekParams alloc] init];
        params.position = [NSNumber numberWithUnsignedLongLong:10000ULL];
        [cluster seekWithParams:params
              completionHandler:^(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");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                           endpoint:1
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSampledPositionWithCompletionHandler:^(
            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");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                           endpoint: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
              completionHandler:^(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;
    }
};

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 : Reads the CurrentState attribute\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0000 && MEDIAPLAYBACK.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsTheCurrentStateAttribute_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Reads the PlaybackSpeed attribute from the DUT\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0004 && MEDIAPLAYBACK.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsThePlaybackSpeedAttributeFromTheDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Sends a FastForward command\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsAFastForwardCommand_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Reads the PlaybackSpeed attribute from the DUT\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0004 && MEDIAPLAYBACK.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsThePlaybackSpeedAttributeFromTheDut_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Sends a Rewind command to the DUT\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C06.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsARewindCommandToTheDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Reads the CurrentState attribute\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0000 && MEDIAPLAYBACK.S.C06.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsTheCurrentStateAttribute_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Reads the PlaybackSpeed attribute from the DUT\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.A0004 && MEDIAPLAYBACK.S.C06.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsThePlaybackSpeedAttributeFromTheDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Sends a Rewind command to the DUT\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C06.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsARewindCommandToTheDut_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Reads the PlaybackSpeed attribute from the DUT\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.A0004 && MEDIAPLAYBACK.S.C06.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsThePlaybackSpeedAttributeFromTheDut_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Sends a Play command\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsAPlayCommand_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Reads the PlaybackSpeed attribute from the DUT\n");
            if (ShouldSkip("MEDIAPLAYBACK.S.A0004 && MEDIAPLAYBACK.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestReadsThePlaybackSpeedAttributeFromTheDut_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Sends consecutive FastForward commands\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C07.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsConsecutiveFastForwardCommands_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Sends consecutive Rewind commands\n");
            if (ShouldSkip("PICS_USER_PROMPT && MEDIAPLAYBACK.S.C06.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsConsecutiveRewindCommands_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");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                           endpoint:1
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

        [cluster fastForwardWithCompletionHandler:^(
            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 TestReadsTheCurrentStateAttribute_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                           endpoint:1
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentStateWithCompletionHandler:^(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_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                           endpoint:1
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePlaybackSpeedWithCompletionHandler:^(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_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                           endpoint:1
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster fastForwardWithCompletionHandler:^(
            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 TestReadsThePlaybackSpeedAttributeFromTheDut_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                           endpoint:1
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePlaybackSpeedWithCompletionHandler:^(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_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                           endpoint:1
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster rewindWithCompletionHandler:^(
            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 TestReadsTheCurrentStateAttribute_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                           endpoint:1
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentStateWithCompletionHandler:^(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_11()
    {
        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_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                           endpoint:1
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster rewindWithCompletionHandler:^(
            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 TestReadsThePlaybackSpeedAttributeFromTheDut_13()
    {
        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_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                           endpoint:1
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            playWithCompletionHandler:^(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 TestReadsThePlaybackSpeedAttributeFromTheDut_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                           endpoint:1
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePlaybackSpeedWithCompletionHandler:^(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_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 TestSendsConsecutiveRewindCommands_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_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("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<uint16_t> mTimeout;

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

        [cluster readAttributeOutputListWithCompletionHandler:^(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");
        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRAudioOutputClusterSelectOutputParams alloc] init];
        params.index = [NSNumber numberWithUnsignedChar:1U];
        [cluster selectOutputWithParams:params
                      completionHandler:^(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");
        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentOutputWithCompletionHandler:^(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, 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("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<uint16_t> 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");
        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOutputListWithCompletionHandler:^(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");
        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRAudioOutputClusterRenameOutputParams alloc] init];
        params.index = [NSNumber numberWithUnsignedChar:1U];
        params.name = @"CertTest";
        [cluster renameOutputWithParams:params
                      completionHandler:^(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("targetvalue1", 0, UINT8_MAX, &mTargetvalue1);
        AddArgument("targetvalue2", 0, UINT8_MAX, &mTargetvalue2);
        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> mTargetvalue1;
    chip::Optional<uint8_t> mTargetvalue2;
    chip::Optional<uint16_t> mTimeout;

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

        [cluster readAttributeCurrentTargetWithCompletionHandler:^(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");
        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
                                                                                               endpoint:1
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetListWithCompletionHandler:^(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");
        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
                                                                                               endpoint:1
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRTargetNavigatorClusterNavigateTargetParams alloc] init];
        params.target = mTargetvalue1.HasValue() ? [NSNumber numberWithUnsignedChar:mTargetvalue1.Value()]
                                                 : [NSNumber numberWithUnsignedChar:1U];
        [cluster navigateTargetWithParams:params
                        completionHandler:^(
                            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");
        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
                                                                                               endpoint:1
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentTargetWithCompletionHandler:^(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, mTargetvalue1.HasValue() ? mTargetvalue1.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");
        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
                                                                                                 endpoint:3
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

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

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

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

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

        [cluster readAttributeAllowedVendorListWithCompletionHandler:^(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");
        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
                                                                                               endpoint:1
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptHeaderWithCompletionHandler:^(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");
        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
                                                                                               endpoint:1
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeSupportedStreamingProtocolsWithCompletionHandler:^(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");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletionHandler:^(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");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletionHandler:^(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");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletionHandler:^(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");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletionHandler:^(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");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                           endpoint: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
                          completionHandler:^(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");
        MTRBaseClusterOtaSoftwareUpdateRequestor * cluster =
            [[MTRBaseClusterOtaSoftwareUpdateRequestor alloc] initWithDevice:device endpoint: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
                             completionHandler:^(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");
        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
                                                                                                 endpoint:1
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletionHandler:^(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");
        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
                                                                                                 endpoint:1
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletionHandler:^(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");
        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
                                                                                                 endpoint:1
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
                                                                                                 endpoint:1
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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");
        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
                                                                                                 endpoint:1
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletionHandler:^(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");
        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
                                                                                                 endpoint:1
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOccupancyWithCompletionHandler:^(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");
        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
                                                                                                 endpoint:1
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOccupancySensorTypeWithCompletionHandler:^(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");
        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
                                                                                                 endpoint:1
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeOccupancySensorTypeBitmapWithCompletionHandler:^(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], 273U));

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsOptionalAttributePIROccupiedToUnoccupiedDelay_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
                                                                                                 endpoint:1
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePirOccupiedToUnoccupiedDelayWithCompletionHandler:^(
            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");
        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
                                                                                                 endpoint:1
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePirUnoccupiedToOccupiedDelayWithCompletionHandler:^(
            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");
        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
                                                                                                 endpoint:1
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePirUnoccupiedToOccupiedThresholdWithCompletionHandler:^(
            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");
        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
                                                                                                 endpoint:1
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeUltrasonicOccupiedToUnoccupiedDelayWithCompletionHandler:^(
            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");
        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
                                                                                                 endpoint:1
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeUltrasonicUnoccupiedToOccupiedDelayWithCompletionHandler:^(
            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");
        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
                                                                                                 endpoint:1
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeUltrasonicUnoccupiedToOccupiedThresholdWithCompletionHandler:^(
            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");
        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
                                                                                                 endpoint:1
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePhysicalContactOccupiedToUnoccupiedDelayWithCompletionHandler:^(
            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");
        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
                                                                                                 endpoint:1
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePhysicalContactUnoccupiedToOccupiedDelayWithCompletionHandler:^(
            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");
        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
                                                                                                 endpoint:1
                                                                                                    queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePhysicalContactUnoccupiedToOccupiedThresholdWithCompletionHandler:^(
            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 : Read the global attribute: FeatureMap\n");
            if (ShouldSkip(" !OO.S.F00 ")) {
                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 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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGlobalSceneControlWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnTimeWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOffWaitTimeWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeStartUpOnOffWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster toggleWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster toggleWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id startUpOnOffArgument;
        startUpOnOffArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeStartUpOnOffWithValue:startUpOnOffArgument
                                   completionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id startUpOnOffArgument;
        startUpOnOffArgument = [NSNumber numberWithUnsignedChar:1U];
        [cluster writeAttributeStartUpOnOffWithValue:startUpOnOffArgument
                                   completionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id startUpOnOffArgument;
        startUpOnOffArgument = [NSNumber numberWithUnsignedChar:2U];
        [cluster writeAttributeStartUpOnOffWithValue:startUpOnOffArgument
                                   completionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id startUpOnOffArgument;
        startUpOnOffArgument = nil;
        [cluster writeAttributeStartUpOnOffWithValue:startUpOnOffArgument
                                   completionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletionHandler:^(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 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_3();
            break;
        case 4:
            ChipLogProgress(
                chipTool, " ***** Test Step 4 : Read the Feature dependent(PS.S.F00-WIRED) attribute in AttributeList\n");
            if (ShouldSkip("PS.S.F00")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentPSSF00WiredAttributeInAttributeList_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Read the Feature dependent(PS.S.F01-BAT) attribute in AttributeList\n");
            if (ShouldSkip("PS.S.F01")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentPSSF01BatAttributeInAttributeList_5();
            break;
        case 6:
            ChipLogProgress(
                chipTool, " ***** Test Step 6 : Read the Feature dependent(PS.S.F02-RECHG) attribute in AttributeList\n");
            if (ShouldSkip("PS.S.F02")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentPSSF02RechgAttributeInAttributeList_6();
            break;
        case 7:
            ChipLogProgress(
                chipTool, " ***** Test Step 7 : Read the Feature dependent(PS.S.F03-REPLC) attribute in AttributeList\n");
            if (ShouldSkip("PS.S.F03")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentPSSF03ReplcAttributeInAttributeList_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_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 TestReadTheGlobalAttributeClusterRevision_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletionHandler:^(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");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletionHandler:^(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], 15UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletionHandler:^(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");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeStatusWithCompletionHandler:^(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");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOrderWithCompletionHandler:^(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");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeDescriptionWithCompletionHandler:^(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");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeWiredAssessedInputVoltageWithCompletionHandler:^(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");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeWiredAssessedInputFrequencyWithCompletionHandler:^(
            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");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeWiredCurrentTypeWithCompletionHandler:^(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");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeWiredAssessedCurrentWithCompletionHandler:^(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");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeWiredNominalVoltageWithCompletionHandler:^(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");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeWiredMaximumCurrentWithCompletionHandler:^(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");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeWiredPresentWithCompletionHandler:^(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");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeActiveWiredFaultsWithCompletionHandler:^(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");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatVoltageWithCompletionHandler:^(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");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatPercentRemainingWithCompletionHandler:^(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");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatTimeRemainingWithCompletionHandler:^(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");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatChargeLevelWithCompletionHandler:^(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");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatReplacementNeededWithCompletionHandler:^(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");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatReplaceabilityWithCompletionHandler:^(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");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatPresentWithCompletionHandler:^(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");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeActiveBatFaultsWithCompletionHandler:^(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");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeBatReplacementDescriptionWithCompletionHandler:^(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");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatCommonDesignationWithCompletionHandler:^(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");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatANSIDesignationWithCompletionHandler:^(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");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatIECDesignationWithCompletionHandler:^(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");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatApprovedChemistryWithCompletionHandler:^(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");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatCapacityWithCompletionHandler:^(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");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatQuantityWithCompletionHandler:^(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");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatChargeStateWithCompletionHandler:^(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");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatTimeToFullChargeWithCompletionHandler:^(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");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeBatFunctionalWhileChargingWithCompletionHandler:^(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");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBatChargingCurrentWithCompletionHandler:^(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");
        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeActiveBatChargeFaultsWithCompletionHandler:^(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 : Read the global attribute: FeatureMap\n");
            if (ShouldSkip(" !PRS.S.F00 ")) {
                NextTest();
                return;
            }
            err = TestReadTheGlobalAttributeFeatureMap_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");
        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                                                       endpoint:1
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletionHandler:^(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");
        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                                                       endpoint:1
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletionHandler:^(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");
        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                                                       endpoint:1
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletionHandler:^(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 TestReadTheGlobalMandatoryAttributeAttributeList_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                                                       endpoint:1
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                                                       endpoint:1
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                                                       endpoint:1
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                                                       endpoint:1
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                                                       endpoint:1
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                                                       endpoint:1
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                                                       endpoint:1
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                                                       endpoint:1
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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");
        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                                                       endpoint:1
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletionHandler:^(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");
        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                                                       endpoint:1
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMeasuredValueWithCompletionHandler:^(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");
        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                                                       endpoint:1
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinMeasuredValueWithCompletionHandler:^(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");
        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                                                       endpoint:1
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxMeasuredValueWithCompletionHandler:^(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");
        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                                                       endpoint:1
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeToleranceWithCompletionHandler:^(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");
        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                                                       endpoint:1
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeScaledValueWithCompletionHandler:^(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");
        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                                                       endpoint:1
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinScaledValueWithCompletionHandler:^(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");
        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                                                       endpoint:1
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxScaledValueWithCompletionHandler:^(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");
        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                                                       endpoint:1
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeScaledToleranceWithCompletionHandler:^(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");
        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
                                                                                                       endpoint:1
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeScaleWithCompletionHandler:^(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_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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxPressureWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxSpeedWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxFlowWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinConstPressureWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxConstPressureWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinCompPressureWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxCompPressureWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinConstSpeedWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxConstSpeedWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinConstFlowWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxConstFlowWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinConstTempWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxConstTempWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePumpStatusWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEffectiveOperationModeWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEffectiveControlModeWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCapacityWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSpeedWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLifetimeRunningHoursWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePowerWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLifetimeEnergyConsumedWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationModeWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeControlModeWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id operationModeArgument;
        operationModeArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOperationModeWithValue:operationModeArgument
                                    completionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEffectiveOperationModeWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id operationModeArgument;
        operationModeArgument = [NSNumber numberWithUnsignedChar:1U];
        [cluster writeAttributeOperationModeWithValue:operationModeArgument
                                    completionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEffectiveOperationModeWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id operationModeArgument;
        operationModeArgument = [NSNumber numberWithUnsignedChar:2U];
        [cluster
            writeAttributeOperationModeWithValue:operationModeArgument
                               completionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEffectiveOperationModeWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id operationModeArgument;
        operationModeArgument = [NSNumber numberWithUnsignedChar:3U];
        [cluster writeAttributeOperationModeWithValue:operationModeArgument
                                    completionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEffectiveOperationModeWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id operationModeArgument;
        operationModeArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOperationModeWithValue:operationModeArgument
                                    completionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEffectiveOperationModeWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id controlModeArgument;
        controlModeArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeControlModeWithValue:controlModeArgument
                                  completionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEffectiveControlModeWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id controlModeArgument;
        controlModeArgument = [NSNumber numberWithUnsignedChar:1U];
        [cluster writeAttributeControlModeWithValue:controlModeArgument
                                  completionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEffectiveControlModeWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id controlModeArgument;
        controlModeArgument = [NSNumber numberWithUnsignedChar:2U];
        [cluster writeAttributeControlModeWithValue:controlModeArgument
                                  completionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEffectiveControlModeWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id controlModeArgument;
        controlModeArgument = [NSNumber numberWithUnsignedChar:3U];
        [cluster writeAttributeControlModeWithValue:controlModeArgument
                                  completionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEffectiveControlModeWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id controlModeArgument;
        controlModeArgument = [NSNumber numberWithUnsignedChar:5U];
        [cluster writeAttributeControlModeWithValue:controlModeArgument
                                  completionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEffectiveControlModeWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id controlModeArgument;
        controlModeArgument = [NSNumber numberWithUnsignedChar:7U];
        [cluster writeAttributeControlModeWithValue:controlModeArgument
                                  completionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEffectiveControlModeWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id lifetimeRunningHoursArgument;
        lifetimeRunningHoursArgument = [NSNumber numberWithUnsignedInt:1UL];
        [cluster writeAttributeLifetimeRunningHoursWithValue:lifetimeRunningHoursArgument
                                           completionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLifetimeRunningHoursWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id lifetimeRunningHoursArgument;
        lifetimeRunningHoursArgument = [NSNumber numberWithUnsignedInt:2UL];
        [cluster writeAttributeLifetimeRunningHoursWithValue:lifetimeRunningHoursArgument
                                           completionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLifetimeRunningHoursWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id lifetimeRunningHoursArgument;
        lifetimeRunningHoursArgument = [NSNumber numberWithUnsignedInt:3UL];
        [cluster writeAttributeLifetimeRunningHoursWithValue:lifetimeRunningHoursArgument
                                           completionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLifetimeRunningHoursWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id lifetimeEnergyConsumedArgument;
        lifetimeEnergyConsumedArgument = [NSNumber numberWithUnsignedInt:1UL];
        [cluster writeAttributeLifetimeEnergyConsumedWithValue:lifetimeEnergyConsumedArgument
                                             completionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLifetimeEnergyConsumedWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id lifetimeEnergyConsumedArgument;
        lifetimeEnergyConsumedArgument = [NSNumber numberWithUnsignedInt:2UL];
        [cluster writeAttributeLifetimeEnergyConsumedWithValue:lifetimeEnergyConsumedArgument
                                             completionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLifetimeEnergyConsumedWithCompletionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id lifetimeEnergyConsumedArgument;
        lifetimeEnergyConsumedArgument = [NSNumber numberWithUnsignedInt:3UL];
        [cluster writeAttributeLifetimeEnergyConsumedWithValue:lifetimeEnergyConsumedArgument
                                             completionHandler:^(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");
        MTRBaseClusterPumpConfigurationAndControl * cluster =
            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLifetimeEnergyConsumedWithCompletionHandler:^(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");
        MTRBaseClusterPowerSourceConfiguration * cluster =
            [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletionHandler:^(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");
        MTRBaseClusterPowerSourceConfiguration * cluster =
            [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletionHandler:^(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");
        MTRBaseClusterPowerSourceConfiguration * cluster =
            [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterPowerSourceConfiguration * cluster =
            [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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");
        MTRBaseClusterPowerSourceConfiguration * cluster =
            [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletionHandler:^(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_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");
        MTRBaseClusterRelativeHumidityMeasurement * cluster =
            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletionHandler:^(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");
        MTRBaseClusterRelativeHumidityMeasurement * cluster =
            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletionHandler:^(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");
        MTRBaseClusterRelativeHumidityMeasurement * cluster =
            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterRelativeHumidityMeasurement * cluster =
            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterRelativeHumidityMeasurement * cluster =
            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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");
        MTRBaseClusterRelativeHumidityMeasurement * cluster =
            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletionHandler:^(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");
        MTRBaseClusterRelativeHumidityMeasurement * cluster =
            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinMeasuredValueWithCompletionHandler:^(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");
        MTRBaseClusterRelativeHumidityMeasurement * cluster =
            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxMeasuredValueWithCompletionHandler:^(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");
        MTRBaseClusterRelativeHumidityMeasurement * cluster =
            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMeasuredValueWithCompletionHandler:^(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");
        MTRBaseClusterRelativeHumidityMeasurement * cluster =
            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeToleranceWithCompletionHandler:^(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: FeatureMap\n");
            err = TestReadTheGlobalAttributeFeatureMap_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Check values of flags in this FeatureMap\n");
            if (ShouldSkip("PICS_USER_PROMPT && SWTCH.S.F00")) {
                NextTest();
                return;
            }
            err = TestCheckValuesOfFlagsInThisFeatureMap_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Check values of flags in this FeatureMap\n");
            if (ShouldSkip("PICS_USER_PROMPT && SWTCH.S.F01")) {
                NextTest();
                return;
            }
            err = TestCheckValuesOfFlagsInThisFeatureMap_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Check values of flags in this FeatureMap\n");
            if (ShouldSkip("PICS_USER_PROMPT && SWTCH.S.F02")) {
                NextTest();
                return;
            }
            err = TestCheckValuesOfFlagsInThisFeatureMap_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Check values of flags in this FeatureMap\n");
            if (ShouldSkip("PICS_USER_PROMPT && SWTCH.S.F03")) {
                NextTest();
                return;
            }
            err = TestCheckValuesOfFlagsInThisFeatureMap_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Check values of flags in this FeatureMap\n");
            if (ShouldSkip("PICS_USER_PROMPT && SWTCH.S.F04")) {
                NextTest();
                return;
            }
            err = TestCheckValuesOfFlagsInThisFeatureMap_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : read the global attribute: ClusterRevision\n");
            err = TestReadTheGlobalAttributeClusterRevision_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);
    }
    NSNumber * _Nonnull FeatureMapValue;

    CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterSwitch * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

            {
                FeatureMapValue = value;
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckValuesOfFlagsInThisFeatureMap_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 TestCheckValuesOfFlagsInThisFeatureMap_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 TestCheckValuesOfFlagsInThisFeatureMap_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 TestCheckValuesOfFlagsInThisFeatureMap_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 TestCheckValuesOfFlagsInThisFeatureMap_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 TestReadTheGlobalAttributeClusterRevision_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterSwitch * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletionHandler:^(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));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterSwitch * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterSwitch * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterSwitch * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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");
        MTRBaseClusterSwitch * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletionHandler:^(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");
        MTRBaseClusterTemperatureMeasurement * cluster =
            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletionHandler:^(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");
        MTRBaseClusterTemperatureMeasurement * cluster =
            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletionHandler:^(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");
        MTRBaseClusterTemperatureMeasurement * cluster =
            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterTemperatureMeasurement * cluster =
            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterTemperatureMeasurement * cluster =
            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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");
        MTRBaseClusterTemperatureMeasurement * cluster =
            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletionHandler:^(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: MeasuredValue\n");
            if (ShouldSkip("TMP.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadTheMandatoryAttributeMeasuredValue_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read the mandatory attribute: MinMeasuredValue\n");
            if (ShouldSkip("TMP.S.A0001")) {
                NextTest();
                return;
            }
            err = TestReadTheMandatoryAttributeMinMeasuredValue_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read the mandatory attribute: MaxMeasuredValue\n");
            if (ShouldSkip("TMP.S.A0002")) {
                NextTest();
                return;
            }
            err = TestReadTheMandatoryAttributeMaxMeasuredValue_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 TestReadTheMandatoryAttributeMeasuredValue_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTemperatureMeasurement * cluster =
            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMeasuredValueWithCompletionHandler:^(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 TestReadTheMandatoryAttributeMinMeasuredValue_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTemperatureMeasurement * cluster =
            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinMeasuredValueWithCompletionHandler:^(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_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTemperatureMeasurement * cluster =
            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxMeasuredValueWithCompletionHandler:^(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 TestReadTheOptionalAttributeTolerance_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTemperatureMeasurement * cluster =
            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeToleranceWithCompletionHandler:^(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 : Read the global attribute: AttributeList\n");
            err = TestReadTheGlobalAttributeAttributeList_3();
            break;
        case 4:
            ChipLogProgress(
                chipTool, " ***** Test Step 4 : Read the Feature dependent(TSTAT.S.F00(HEAT)) attribute in AttributeList\n");
            if (ShouldSkip("TSTAT.S.F00")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentTSTATSF00HEATAttributeInAttributeList_4();
            break;
        case 5:
            ChipLogProgress(
                chipTool, " ***** Test Step 5 : Read the Feature dependent(TSTAT.S.F01(COOL)) attribute in AttributeList\n");
            if (ShouldSkip("TSTAT.S.F01")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentTSTATSF01COOLAttributeInAttributeList_5();
            break;
        case 6:
            ChipLogProgress(
                chipTool, " ***** Test Step 6 : Read the Feature dependent(TSTAT.S.F02(OCC)) attribute in AttributeList\n");
            if (ShouldSkip("TSTAT.S.F02")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentTSTATSF02OCCAttributeInAttributeList_6();
            break;
        case 7:
            ChipLogProgress(chipTool,
                " ***** Test Step 7 : 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_7();
            break;
        case 8:
            ChipLogProgress(chipTool,
                " ***** Test Step 8 : 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_8();
            break;
        case 9:
            ChipLogProgress(
                chipTool, " ***** Test Step 9 : Read the Feature dependent(TSTAT.S.F05(AUTO)) attribute in AttributeList\n");
            if (ShouldSkip("TSTAT.S.F05")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentTSTATSF05AUTOAttributeInAttributeList_9();
            break;
        case 10:
            ChipLogProgress(
                chipTool, " ***** Test Step 10 : Read the Feature dependent(TSTAT.S.F03(SCH)) attribute in AttributeList\n");
            if (ShouldSkip("TSTAT.S.F03")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentTSTATSF03SCHAttributeInAttributeList_10();
            break;
        case 11:
            ChipLogProgress(
                chipTool, " ***** Test Step 11 : Read the Feature dependent(TSTAT.S.F04(SB)) attribute in AttributeList\n");
            if (ShouldSkip("TSTAT.S.F04")) {
                NextTest();
                return;
            }
            err = TestReadTheFeatureDependentTSTATSF04SBAttributeInAttributeList_11();
            break;
        case 12:
            ChipLogProgress(chipTool,
                " ***** Test Step 12 : 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_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Read the global attribute: AcceptedCommandList\n");
            err = TestReadTheGlobalAttributeAcceptedCommandList_13();
            break;
        case 14:
            ChipLogProgress(
                chipTool, " ***** Test Step 14 : Read Feature dependent(TSTAT.S.F03(SCH)) commands in AcceptedCommandList\n");
            if (ShouldSkip("TSTAT.S.F03")) {
                NextTest();
                return;
            }
            err = TestReadFeatureDependentTSTATSF03SCHCommandsInAcceptedCommandList_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Read the global attribute: GeneratedCommandList\n");
            err = TestReadTheGlobalAttributeGeneratedCommandList_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");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletionHandler:^(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");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletionHandler:^(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], 1UL));
            VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("featureMap", [value unsignedIntValue], 63UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletionHandler:^(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_TSTAT_2_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_TSTAT_2_1()
        : TestCommandBridge("Test_TC_TSTAT_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_TSTAT_2_1() {}

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

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

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_TSTAT_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 attributes from DUT: LocalTemperature\n");
            err = TestReadsMandatoryAttributesFromDutLocalTemperature_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Read OutdoorTemperature attribute from the DUT\n");
            if (ShouldSkip("TSTAT.S.A0001")) {
                NextTest();
                return;
            }
            err = TestReadOutdoorTemperatureAttributeFromTheDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Read Occupancy attribute from the DUT\n");
            if (ShouldSkip("TSTAT.S.F02")) {
                NextTest();
                return;
            }
            err = TestReadOccupancyAttributeFromTheDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Reads mandatory attributes from DUT: AbsMinHeatSetpointLimit\n");
            if (ShouldSkip("TSTAT.S.A0003")) {
                NextTest();
                return;
            }
            err = TestReadsMandatoryAttributesFromDutAbsMinHeatSetpointLimit_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : Reads mandatory attributes from DUT: AbsMaxHeatSetpointLimit\n");
            if (ShouldSkip("TSTAT.S.A0004")) {
                NextTest();
                return;
            }
            err = TestReadsMandatoryAttributesFromDutAbsMaxHeatSetpointLimit_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Reads optional attributes from DUT: AbsMinCoolSetpointLimit\n");
            if (ShouldSkip("TSTAT.S.A0005")) {
                NextTest();
                return;
            }
            err = TestReadsOptionalAttributesFromDutAbsMinCoolSetpointLimit_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : Reads optional attributes from DUT: AbsMaxCoolSetpointLimit\n");
            if (ShouldSkip("TSTAT.S.A0006")) {
                NextTest();
                return;
            }
            err = TestReadsOptionalAttributesFromDutAbsMaxCoolSetpointLimit_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read PICoolingDemand attribute from the DUT\n");
            if (ShouldSkip("TSTAT.S.A0007")) {
                NextTest();
                return;
            }
            err = TestReadPICoolingDemandAttributeFromTheDut_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Read PIHeatingDemand attribute from the DUT\n");
            if (ShouldSkip("TSTAT.S.A0008")) {
                NextTest();
                return;
            }
            err = TestReadPIHeatingDemandAttributeFromTheDut_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Read HVACSystemTypeConfiguration attribute from the DUT\n");
            if (ShouldSkip("TSTAT.S.A0009")) {
                NextTest();
                return;
            }
            err = TestReadHVACSystemTypeConfigurationAttributeFromTheDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Read LocalTemperatureCalibration attribute from the DUT\n");
            if (ShouldSkip("TSTAT.S.A0010")) {
                NextTest();
                return;
            }
            err = TestReadLocalTemperatureCalibrationAttributeFromTheDut_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Reads optional attributes from DUT: OccupiedCoolingSetpoint\n");
            if (ShouldSkip("TSTAT.S.F01")) {
                NextTest();
                return;
            }
            err = TestReadsOptionalAttributesFromDutOccupiedCoolingSetpoint_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Reads mandatory attributes from DUT: OccupiedHeatingSetpoint\n");
            if (ShouldSkip("TSTAT.S.F00")) {
                NextTest();
                return;
            }
            err = TestReadsMandatoryAttributesFromDutOccupiedHeatingSetpoint_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Read UnoccupiedCoolingSetpoint attribute from the DUT\n");
            if (ShouldSkip("TSTAT.S.F01 && TSTAT.S.F02")) {
                NextTest();
                return;
            }
            err = TestReadUnoccupiedCoolingSetpointAttributeFromTheDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Read UnoccupiedHeatingSetpoint attribute from the DUT\n");
            if (ShouldSkip("TSTAT.S.F00 && TSTAT.S.F02")) {
                NextTest();
                return;
            }
            err = TestReadUnoccupiedHeatingSetpointAttributeFromTheDut_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Reads attribute from DUT: MinHeatSetpointLimit\n");
            if (ShouldSkip("TSTAT.S.A0015")) {
                NextTest();
                return;
            }
            err = TestReadsAttributeFromDutMinHeatSetpointLimit_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Reads attribute from DUT: MaxHeatSetpointLimit\n");
            if (ShouldSkip("TSTAT.S.A0016")) {
                NextTest();
                return;
            }
            err = TestReadsAttributeFromDutMaxHeatSetpointLimit_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Reads optional attributes from DUT: MinCoolSetpointLimit\n");
            if (ShouldSkip("TSTAT.S.A0017")) {
                NextTest();
                return;
            }
            err = TestReadsOptionalAttributesFromDutMinCoolSetpointLimit_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Reads optional attributes from DUT: MaxCoolSetpointLimit\n");
            if (ShouldSkip("TSTAT.S.A0018")) {
                NextTest();
                return;
            }
            err = TestReadsOptionalAttributesFromDutMaxCoolSetpointLimit_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Reads optional attributes from DUT: MinSetpointDeadBand\n");
            if (ShouldSkip("TSTAT.S.F05")) {
                NextTest();
                return;
            }
            err = TestReadsOptionalAttributesFromDutMinSetpointDeadBand_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Read RemoteSensing attribute from the DUT\n");
            if (ShouldSkip("TSTAT.S.A001a")) {
                NextTest();
                return;
            }
            err = TestReadRemoteSensingAttributeFromTheDut_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : Reads mandatory attributes from DUT: ControlSequenceOfOperation\n");
            err = TestReadsMandatoryAttributesFromDutControlSequenceOfOperation_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : Reads mandatory attributes from DUT: SystemMode\n");
            err = TestReadsMandatoryAttributesFromDutSystemMode_23();
            break;
        case 24:
            ChipLogProgress(chipTool, " ***** Test Step 24 : Read ThermostatRunningMode attribute from the DUT\n");
            if (ShouldSkip("TSTAT.S.A001e")) {
                NextTest();
                return;
            }
            err = TestReadThermostatRunningModeAttributeFromTheDut_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : Reads constraints of optional attributes from DUT: StartOfWeek\n");
            if (ShouldSkip("TSTAT.S.F03")) {
                NextTest();
                return;
            }
            err = TestReadsConstraintsOfOptionalAttributesFromDutStartOfWeek_25();
            break;
        case 26:
            ChipLogProgress(chipTool, " ***** Test Step 26 : Reads optional attributes from DUT: NumberOfWeeklyTransitions\n");
            if (ShouldSkip("TSTAT.S.F03")) {
                NextTest();
                return;
            }
            err = TestReadsOptionalAttributesFromDutNumberOfWeeklyTransitions_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : Reads optional attributes from DUT: NumberOfDailyTransitions\n");
            if (ShouldSkip("TSTAT.S.F03")) {
                NextTest();
                return;
            }
            err = TestReadsOptionalAttributesFromDutNumberOfDailyTransitions_27();
            break;
        case 28:
            ChipLogProgress(chipTool, " ***** Test Step 28 : Read TemperatureSetpointHold attribute from the DUT\n");
            if (ShouldSkip("TSTAT.S.A0023")) {
                NextTest();
                return;
            }
            err = TestReadTemperatureSetpointHoldAttributeFromTheDut_28();
            break;
        case 29:
            ChipLogProgress(chipTool, " ***** Test Step 29 : Read TemperatureSetpointHoldDuration attribute from the DUT\n");
            if (ShouldSkip("TSTAT.S.A0024")) {
                NextTest();
                return;
            }
            err = TestReadTemperatureSetpointHoldDurationAttributeFromTheDut_29();
            break;
        case 30:
            ChipLogProgress(chipTool, " ***** Test Step 30 : Read ThermostatProgrammingOperationMode attribute from the DUT\n");
            if (ShouldSkip("TSTAT.S.A0025")) {
                NextTest();
                return;
            }
            err = TestReadThermostatProgrammingOperationModeAttributeFromTheDut_30();
            break;
        case 31:
            ChipLogProgress(chipTool, " ***** Test Step 31 : Read ThermostatRunningState attribute from the DUT\n");
            if (ShouldSkip("TSTAT.S.A0029")) {
                NextTest();
                return;
            }
            err = TestReadThermostatRunningStateAttributeFromTheDut_31();
            break;
        case 32:
            ChipLogProgress(chipTool, " ***** Test Step 32 : Read SetpointChangeSource attribute from the DUT\n");
            if (ShouldSkip("TSTAT.S.A0030")) {
                NextTest();
                return;
            }
            err = TestReadSetpointChangeSourceAttributeFromTheDut_32();
            break;
        case 33:
            ChipLogProgress(chipTool, " ***** Test Step 33 : Read SetpointChangeAmount attribute from the DUT\n");
            if (ShouldSkip("TSTAT.S.A0031")) {
                NextTest();
                return;
            }
            err = TestReadSetpointChangeAmountAttributeFromTheDut_33();
            break;
        case 34:
            ChipLogProgress(chipTool, " ***** Test Step 34 : Read SetpointChangeSourceTimestamp attribute from the DUT\n");
            if (ShouldSkip("TSTAT.S.A0032")) {
                NextTest();
                return;
            }
            err = TestReadSetpointChangeSourceTimestampAttributeFromTheDut_34();
            break;
        case 35:
            ChipLogProgress(chipTool, " ***** Test Step 35 : Read OccupiedSetback attribute from the DUT\n");
            if (ShouldSkip("TSTAT.S.F02")) {
                NextTest();
                return;
            }
            err = TestReadOccupiedSetbackAttributeFromTheDut_35();
            break;
        case 36:
            ChipLogProgress(chipTool, " ***** Test Step 36 : Read OccupiedSetbackMin attribute from the DUT\n");
            if (ShouldSkip("TSTAT.S.F02")) {
                NextTest();
                return;
            }
            err = TestReadOccupiedSetbackMinAttributeFromTheDut_36();
            break;
        case 37:
            ChipLogProgress(chipTool, " ***** Test Step 37 : Read OccupiedSetbackMax attribute from the DUT\n");
            if (ShouldSkip("TSTAT.S.F02")) {
                NextTest();
                return;
            }
            err = TestReadOccupiedSetbackMaxAttributeFromTheDut_37();
            break;
        case 38:
            ChipLogProgress(chipTool, " ***** Test Step 38 : Read UnoccupiedSetback attribute from the DUT\n");
            if (ShouldSkip("TSTAT.S.F02 && TSTAT.S.F04")) {
                NextTest();
                return;
            }
            err = TestReadUnoccupiedSetbackAttributeFromTheDut_38();
            break;
        case 39:
            ChipLogProgress(chipTool, " ***** Test Step 39 : Read UnoccupiedSetbackMin attribute from the DUT\n");
            if (ShouldSkip("TSTAT.S.F02 && TSTAT.S.F04")) {
                NextTest();
                return;
            }
            err = TestReadUnoccupiedSetbackMinAttributeFromTheDut_39();
            break;
        case 40:
            ChipLogProgress(chipTool, " ***** Test Step 40 : Read UnoccupiedSetbackMax attribute from the DUT\n");
            if (ShouldSkip("TSTAT.S.F02 && TSTAT.S.F04")) {
                NextTest();
                return;
            }
            err = TestReadUnoccupiedSetbackMaxAttributeFromTheDut_40();
            break;
        case 41:
            ChipLogProgress(chipTool, " ***** Test Step 41 : Read EmergencyHeatDelta attribute from the DUT\n");
            if (ShouldSkip("TSTAT.S.A003a")) {
                NextTest();
                return;
            }
            err = TestReadEmergencyHeatDeltaAttributeFromTheDut_41();
            break;
        case 42:
            ChipLogProgress(chipTool, " ***** Test Step 42 : Read ACType attribute from the DUT\n");
            if (ShouldSkip("TSTAT.S.A0040")) {
                NextTest();
                return;
            }
            err = TestReadACTypeAttributeFromTheDut_42();
            break;
        case 43:
            ChipLogProgress(chipTool, " ***** Test Step 43 : Read ACCapacity attribute from the DUT\n");
            if (ShouldSkip("TSTAT.S.A0041")) {
                NextTest();
                return;
            }
            err = TestReadACCapacityAttributeFromTheDut_43();
            break;
        case 44:
            ChipLogProgress(chipTool, " ***** Test Step 44 : Read ACRefrigerantType attribute from the DUT\n");
            if (ShouldSkip("TSTAT.S.A0042")) {
                NextTest();
                return;
            }
            err = TestReadACRefrigerantTypeAttributeFromTheDut_44();
            break;
        case 45:
            ChipLogProgress(chipTool, " ***** Test Step 45 : Read ACCompressorType attribute from the DUT\n");
            if (ShouldSkip("TSTAT.S.A0043")) {
                NextTest();
                return;
            }
            err = TestReadACCompressorTypeAttributeFromTheDut_45();
            break;
        case 46:
            ChipLogProgress(chipTool, " ***** Test Step 46 : Read ACErrorCode attribute from the DUT\n");
            if (ShouldSkip("TSTAT.S.A0044")) {
                NextTest();
                return;
            }
            err = TestReadACErrorCodeAttributeFromTheDut_46();
            break;
        case 47:
            ChipLogProgress(chipTool, " ***** Test Step 47 : Read ACLouverPosition attribute from the DUT\n");
            if (ShouldSkip("TSTAT.S.A0045")) {
                NextTest();
                return;
            }
            err = TestReadACLouverPositionAttributeFromTheDut_47();
            break;
        case 48:
            ChipLogProgress(chipTool, " ***** Test Step 48 : Read ACCoilTemperature attribute from the DUT\n");
            if (ShouldSkip("TSTAT.S.A0046")) {
                NextTest();
                return;
            }
            err = TestReadACCoilTemperatureAttributeFromTheDut_48();
            break;
        case 49:
            ChipLogProgress(chipTool, " ***** Test Step 49 : Read ACCapacityFormat attribute from the DUT\n");
            if (ShouldSkip("TSTAT.S.A0047")) {
                NextTest();
                return;
            }
            err = TestReadACCapacityFormatAttributeFromTheDut_49();
            break;
        }

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

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

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

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

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

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

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

    CHIP_ERROR TestReadsMandatoryAttributesFromDutLocalTemperature_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLocalTemperatureWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads mandatory attributes from DUT: LocalTemperature Error: %@", err);

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

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("localTemperature", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue<int16_t>("localTemperature", [value shortValue], -27315));
                VerifyOrReturn(CheckConstraintMaxValue<int16_t>("localTemperature", [value shortValue], 32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadOutdoorTemperatureAttributeFromTheDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOutdoorTemperatureWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read OutdoorTemperature attribute from the DUT Error: %@", err);

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

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("outdoorTemperature", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue<int16_t>("outdoorTemperature", [value shortValue], -27315));
                VerifyOrReturn(CheckConstraintMaxValue<int16_t>("outdoorTemperature", [value shortValue], 32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadOccupancyAttributeFromTheDut_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOccupancyWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read Occupancy attribute from the DUT 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 TestReadsMandatoryAttributesFromDutAbsMinHeatSetpointLimit_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAbsMinHeatSetpointLimitWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads mandatory attributes from DUT: AbsMinHeatSetpointLimit Error: %@", err);

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

            VerifyOrReturn(CheckConstraintType("absMinHeatSetpointLimit", "int16s", "int16s"));
            VerifyOrReturn(CheckConstraintMinValue<int16_t>("absMinHeatSetpointLimit", [value shortValue], -27315));
            VerifyOrReturn(CheckConstraintMaxValue<int16_t>("absMinHeatSetpointLimit", [value shortValue], 32767));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsMandatoryAttributesFromDutAbsMaxHeatSetpointLimit_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAbsMaxHeatSetpointLimitWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads mandatory attributes from DUT: AbsMaxHeatSetpointLimit Error: %@", err);

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

            VerifyOrReturn(CheckConstraintType("absMaxHeatSetpointLimit", "int16s", "int16s"));
            VerifyOrReturn(CheckConstraintMinValue<int16_t>("absMaxHeatSetpointLimit", [value shortValue], -27315));
            VerifyOrReturn(CheckConstraintMaxValue<int16_t>("absMaxHeatSetpointLimit", [value shortValue], 32767));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsOptionalAttributesFromDutAbsMinCoolSetpointLimit_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAbsMinCoolSetpointLimitWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads optional attributes from DUT: AbsMinCoolSetpointLimit Error: %@", err);

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

            VerifyOrReturn(CheckConstraintType("absMinCoolSetpointLimit", "int16s", "int16s"));
            VerifyOrReturn(CheckConstraintMinValue<int16_t>("absMinCoolSetpointLimit", [value shortValue], -27315));
            VerifyOrReturn(CheckConstraintMaxValue<int16_t>("absMinCoolSetpointLimit", [value shortValue], 32767));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsOptionalAttributesFromDutAbsMaxCoolSetpointLimit_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAbsMaxCoolSetpointLimitWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads optional attributes from DUT: AbsMaxCoolSetpointLimit Error: %@", err);

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

            VerifyOrReturn(CheckConstraintType("absMaxCoolSetpointLimit", "int16s", "int16s"));
            VerifyOrReturn(CheckConstraintMinValue<int16_t>("absMaxCoolSetpointLimit", [value shortValue], -27315));
            VerifyOrReturn(CheckConstraintMaxValue<int16_t>("absMaxCoolSetpointLimit", [value shortValue], 32767));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadPICoolingDemandAttributeFromTheDut_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePICoolingDemandWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read PICoolingDemand attribute from the DUT Error: %@", err);

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadPIHeatingDemandAttributeFromTheDut_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePIHeatingDemandWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read PIHeatingDemand attribute from the DUT Error: %@", err);

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadHVACSystemTypeConfigurationAttributeFromTheDut_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeHVACSystemTypeConfigurationWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"Read HVACSystemTypeConfiguration attribute from the DUT Error: %@", err);

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

                VerifyOrReturn(CheckConstraintType("HVACSystemTypeConfiguration", "bitmap8", "bitmap8"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("HVACSystemTypeConfiguration", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("HVACSystemTypeConfiguration", [value unsignedCharValue], 63U));

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadLocalTemperatureCalibrationAttributeFromTheDut_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeLocalTemperatureCalibrationWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"Read LocalTemperatureCalibration attribute from the DUT Error: %@", err);

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

                VerifyOrReturn(CheckConstraintType("localTemperatureCalibration", "int8s", "int8s"));
                VerifyOrReturn(CheckConstraintMinValue<int8_t>("localTemperatureCalibration", [value charValue], 25));
                VerifyOrReturn(CheckConstraintMaxValue<int8_t>("localTemperatureCalibration", [value charValue], -25));

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsOptionalAttributesFromDutOccupiedCoolingSetpoint_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOccupiedCoolingSetpointWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads optional attributes from DUT: OccupiedCoolingSetpoint Error: %@", err);

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

            VerifyOrReturn(CheckConstraintType("occupiedCoolingSetpoint", "int16s", "int16s"));
            VerifyOrReturn(CheckConstraintMinValue<int16_t>("occupiedCoolingSetpoint", [value shortValue], 1600));
            VerifyOrReturn(CheckConstraintMaxValue<int16_t>("occupiedCoolingSetpoint", [value shortValue], 3200));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsMandatoryAttributesFromDutOccupiedHeatingSetpoint_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOccupiedHeatingSetpointWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads mandatory attributes from DUT: OccupiedHeatingSetpoint Error: %@", err);

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

            VerifyOrReturn(CheckConstraintType("occupiedHeatingSetpoint", "int16s", "int16s"));
            VerifyOrReturn(CheckConstraintMinValue<int16_t>("occupiedHeatingSetpoint", [value shortValue], 700));
            VerifyOrReturn(CheckConstraintMaxValue<int16_t>("occupiedHeatingSetpoint", [value shortValue], 3000));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadUnoccupiedCoolingSetpointAttributeFromTheDut_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeUnoccupiedCoolingSetpointWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"Read UnoccupiedCoolingSetpoint attribute from the DUT Error: %@", err);

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

                VerifyOrReturn(CheckConstraintType("unoccupiedCoolingSetpoint", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue<int16_t>("unoccupiedCoolingSetpoint", [value shortValue], 1600));
                VerifyOrReturn(CheckConstraintMaxValue<int16_t>("unoccupiedCoolingSetpoint", [value shortValue], 3200));

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadUnoccupiedHeatingSetpointAttributeFromTheDut_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeUnoccupiedHeatingSetpointWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"Read UnoccupiedHeatingSetpoint attribute from the DUT Error: %@", err);

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

                VerifyOrReturn(CheckConstraintType("unoccupiedHeatingSetpoint", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue<int16_t>("unoccupiedHeatingSetpoint", [value shortValue], 700));
                VerifyOrReturn(CheckConstraintMaxValue<int16_t>("unoccupiedHeatingSetpoint", [value shortValue], 3000));

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsAttributeFromDutMinHeatSetpointLimit_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinHeatSetpointLimitWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads attribute from DUT: MinHeatSetpointLimit Error: %@", err);

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

            VerifyOrReturn(CheckConstraintType("minHeatSetpointLimit", "int16s", "int16s"));
            VerifyOrReturn(CheckConstraintMinValue<int16_t>("minHeatSetpointLimit", [value shortValue], 700));
            VerifyOrReturn(CheckConstraintMaxValue<int16_t>("minHeatSetpointLimit", [value shortValue], 3000));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsAttributeFromDutMaxHeatSetpointLimit_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxHeatSetpointLimitWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads attribute from DUT: MaxHeatSetpointLimit Error: %@", err);

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

            VerifyOrReturn(CheckConstraintType("maxHeatSetpointLimit", "int16s", "int16s"));
            VerifyOrReturn(CheckConstraintMinValue<int16_t>("maxHeatSetpointLimit", [value shortValue], -27315));
            VerifyOrReturn(CheckConstraintMaxValue<int16_t>("maxHeatSetpointLimit", [value shortValue], 32767));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsOptionalAttributesFromDutMinCoolSetpointLimit_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinCoolSetpointLimitWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads optional attributes from DUT: MinCoolSetpointLimit Error: %@", err);

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

            VerifyOrReturn(CheckConstraintType("minCoolSetpointLimit", "int16s", "int16s"));
            VerifyOrReturn(CheckConstraintMinValue<int16_t>("minCoolSetpointLimit", [value shortValue], -27315));
            VerifyOrReturn(CheckConstraintMaxValue<int16_t>("minCoolSetpointLimit", [value shortValue], 32767));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsOptionalAttributesFromDutMaxCoolSetpointLimit_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxCoolSetpointLimitWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads optional attributes from DUT: MaxCoolSetpointLimit Error: %@", err);

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

            VerifyOrReturn(CheckConstraintType("maxCoolSetpointLimit", "int16s", "int16s"));
            VerifyOrReturn(CheckConstraintMinValue<int16_t>("maxCoolSetpointLimit", [value shortValue], -27315));
            VerifyOrReturn(CheckConstraintMaxValue<int16_t>("maxCoolSetpointLimit", [value shortValue], 32767));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsOptionalAttributesFromDutMinSetpointDeadBand_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinSetpointDeadBandWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads optional attributes from DUT: MinSetpointDeadBand Error: %@", err);

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

            VerifyOrReturn(CheckConstraintType("minSetpointDeadBand", "int8s", "int8s"));
            VerifyOrReturn(CheckConstraintMinValue<int8_t>("minSetpointDeadBand", [value charValue], 0));
            VerifyOrReturn(CheckConstraintMaxValue<int8_t>("minSetpointDeadBand", [value charValue], 25));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadRemoteSensingAttributeFromTheDut_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRemoteSensingWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read RemoteSensing attribute from the DUT Error: %@", err);

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

            VerifyOrReturn(CheckConstraintType("remoteSensing", "bitmap8", "bitmap8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("remoteSensing", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("remoteSensing", [value unsignedCharValue], 7U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsMandatoryAttributesFromDutControlSequenceOfOperation_22()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeControlSequenceOfOperationWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"Reads mandatory attributes from DUT: ControlSequenceOfOperation Error: %@", err);

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

                VerifyOrReturn(CheckConstraintType("controlSequenceOfOperation", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("controlSequenceOfOperation", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("controlSequenceOfOperation", [value unsignedCharValue], 5U));

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsMandatoryAttributesFromDutSystemMode_23()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSystemModeWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads mandatory attributes from DUT: SystemMode Error: %@", err);

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

            VerifyOrReturn(CheckConstraintType("systemMode", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("systemMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("systemMode", [value unsignedCharValue], 9U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadThermostatRunningModeAttributeFromTheDut_24()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeThermostatRunningModeWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read ThermostatRunningMode attribute from the DUT Error: %@", err);

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

            VerifyOrReturn(CheckConstraintType("thermostatRunningMode", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("thermostatRunningMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("thermostatRunningMode", [value unsignedCharValue], 9U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsConstraintsOfOptionalAttributesFromDutStartOfWeek_25()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeStartOfWeekWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads constraints of optional attributes from DUT: StartOfWeek Error: %@", err);

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

            VerifyOrReturn(CheckConstraintType("startOfWeek", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("startOfWeek", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("startOfWeek", [value unsignedCharValue], 6U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsOptionalAttributesFromDutNumberOfWeeklyTransitions_26()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeNumberOfWeeklyTransitionsWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"Reads optional attributes from DUT: NumberOfWeeklyTransitions Error: %@", err);

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

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

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsOptionalAttributesFromDutNumberOfDailyTransitions_27()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNumberOfDailyTransitionsWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads optional attributes from DUT: NumberOfDailyTransitions Error: %@", err);

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTemperatureSetpointHoldAttributeFromTheDut_28()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTemperatureSetpointHoldWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read TemperatureSetpointHold attribute from the DUT Error: %@", err);

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

            VerifyOrReturn(CheckConstraintType("temperatureSetpointHold", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("temperatureSetpointHold", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("temperatureSetpointHold", [value unsignedCharValue], 1U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadTemperatureSetpointHoldDurationAttributeFromTheDut_29()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTemperatureSetpointHoldDurationWithCompletionHandler:^(
            NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read TemperatureSetpointHoldDuration attribute from the DUT Error: %@", err);

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

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("temperatureSetpointHoldDuration", "int16u", "int16u"));
                VerifyOrReturn(
                    CheckConstraintMinValue<uint16_t>("temperatureSetpointHoldDuration", [value unsignedShortValue], 0U));
                VerifyOrReturn(
                    CheckConstraintMaxValue<uint16_t>("temperatureSetpointHoldDuration", [value unsignedShortValue], 1440U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadThermostatProgrammingOperationModeAttributeFromTheDut_30()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeThermostatProgrammingOperationModeWithCompletionHandler:^(
            NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read ThermostatProgrammingOperationMode attribute from the DUT Error: %@", err);

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

            VerifyOrReturn(CheckConstraintType("thermostatProgrammingOperationMode", "bitmap8", "bitmap8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("thermostatProgrammingOperationMode", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("thermostatProgrammingOperationMode", [value unsignedCharValue], 7U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadThermostatRunningStateAttributeFromTheDut_31()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeThermostatRunningStateWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read ThermostatRunningState attribute from the DUT Error: %@", err);

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

            VerifyOrReturn(CheckConstraintType("thermostatRunningState", "bitmap16", "bitmap16"));
            VerifyOrReturn(CheckConstraintMinValue<uint16_t>("thermostatRunningState", [value unsignedShortValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint16_t>("thermostatRunningState", [value unsignedShortValue], 127U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadSetpointChangeSourceAttributeFromTheDut_32()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSetpointChangeSourceWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read SetpointChangeSource attribute from the DUT Error: %@", err);

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

            VerifyOrReturn(CheckConstraintType("setpointChangeSource", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("setpointChangeSource", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("setpointChangeSource", [value unsignedCharValue], 2U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadSetpointChangeAmountAttributeFromTheDut_33()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSetpointChangeAmountWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read SetpointChangeAmount attribute from the DUT Error: %@", err);

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

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("setpointChangeAmount", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue<int16_t>("setpointChangeAmount", [value shortValue], -27315));
                VerifyOrReturn(CheckConstraintMaxValue<int16_t>("setpointChangeAmount", [value shortValue], 32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadSetpointChangeSourceTimestampAttributeFromTheDut_34()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeSetpointChangeSourceTimestampWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"Read SetpointChangeSourceTimestamp attribute from the DUT Error: %@", err);

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

                VerifyOrReturn(CheckConstraintType("setpointChangeSourceTimestamp", "utc", "utc"));
                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadOccupiedSetbackAttributeFromTheDut_35()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOccupiedSetbackWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read OccupiedSetback attribute from the DUT Error: %@", err);

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

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("occupiedSetback", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("occupiedSetback", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("occupiedSetback", [value unsignedCharValue], 255U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadOccupiedSetbackMinAttributeFromTheDut_36()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOccupiedSetbackMinWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read OccupiedSetbackMin attribute from the DUT Error: %@", err);

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

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("occupiedSetbackMin", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("occupiedSetbackMin", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("occupiedSetbackMin", [value unsignedCharValue], 255U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadOccupiedSetbackMaxAttributeFromTheDut_37()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOccupiedSetbackMaxWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read OccupiedSetbackMax attribute from the DUT Error: %@", err);

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

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("occupiedSetbackMax", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("occupiedSetbackMax", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("occupiedSetbackMax", [value unsignedCharValue], 255U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadUnoccupiedSetbackAttributeFromTheDut_38()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeUnoccupiedSetbackWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read UnoccupiedSetback attribute from the DUT Error: %@", err);

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

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("unoccupiedSetback", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("unoccupiedSetback", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("unoccupiedSetback", [value unsignedCharValue], 255U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadUnoccupiedSetbackMinAttributeFromTheDut_39()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeUnoccupiedSetbackMinWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read UnoccupiedSetbackMin attribute from the DUT Error: %@", err);

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

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("unoccupiedSetbackMin", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("unoccupiedSetbackMin", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("unoccupiedSetbackMin", [value unsignedCharValue], 255U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadUnoccupiedSetbackMaxAttributeFromTheDut_40()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeUnoccupiedSetbackMaxWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read UnoccupiedSetbackMax attribute from the DUT Error: %@", err);

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

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("unoccupiedSetbackMax", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("unoccupiedSetbackMax", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("unoccupiedSetbackMax", [value unsignedCharValue], 255U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadEmergencyHeatDeltaAttributeFromTheDut_41()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEmergencyHeatDeltaWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read EmergencyHeatDelta attribute from the DUT Error: %@", err);

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadACTypeAttributeFromTheDut_42()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeACTypeWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read ACType attribute from the DUT Error: %@", err);

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

            VerifyOrReturn(CheckConstraintType("ACType", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("ACType", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("ACType", [value unsignedCharValue], 4U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadACCapacityAttributeFromTheDut_43()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeACCapacityWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read ACCapacity attribute from the DUT Error: %@", err);

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadACRefrigerantTypeAttributeFromTheDut_44()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeACRefrigerantTypeWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read ACRefrigerantType attribute from the DUT Error: %@", err);

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

            VerifyOrReturn(CheckConstraintType("ACRefrigerantType", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("ACRefrigerantType", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("ACRefrigerantType", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadACCompressorTypeAttributeFromTheDut_45()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeACCompressorTypeWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read ACCompressorType attribute from the DUT Error: %@", err);

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

            VerifyOrReturn(CheckConstraintType("ACCompressorType", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("ACCompressorType", [value unsignedCharValue], 0U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("ACCompressorType", [value unsignedCharValue], 3U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadACErrorCodeAttributeFromTheDut_46()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeACErrorCodeWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read ACErrorCode attribute from the DUT Error: %@", err);

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

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

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadACLouverPositionAttributeFromTheDut_47()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeACLouverPositionWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read ACLouverPosition attribute from the DUT Error: %@", err);

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

            VerifyOrReturn(CheckConstraintType("ACLouverPosition", "enum8", "enum8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("ACLouverPosition", [value unsignedCharValue], 1U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("ACLouverPosition", [value unsignedCharValue], 5U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadACCoilTemperatureAttributeFromTheDut_48()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeACCoilTemperatureWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read ACCoilTemperature attribute from the DUT Error: %@", err);

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

            if (value != nil) {

                VerifyOrReturn(CheckConstraintType("ACCoilTemperature", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue<int16_t>("ACCoilTemperature", [value shortValue], -27315));
                VerifyOrReturn(CheckConstraintMaxValue<int16_t>("ACCoilTemperature", [value shortValue], 32767));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadACCapacityFormatAttributeFromTheDut_49()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeACCapacityformatWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read ACCapacityFormat attribute from the DUT Error: %@", err);

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

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("ACCapacityformat", actualValue, 0U));
            }

            VerifyOrReturn(CheckConstraintType("ACCapacityformat", "enum8", "enum8"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_TSTAT_2_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_TSTAT_2_2()
        : TestCommandBridge("Test_TC_TSTAT_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_TSTAT_2_2() {}

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

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

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_TSTAT_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 OccupiedCoolingSetpoint attribute from Server DUT and verifies that the value is "
                "within range\n");
            if (ShouldSkip("TSTAT.S.F01")) {
                NextTest();
                return;
            }
            err = TestReadsOccupiedCoolingSetpointAttributeFromServerDutAndVerifiesThatTheValueIsWithinRange_1();
            break;
        case 2:
            ChipLogProgress(chipTool,
                " ***** Test Step 2 : Writes a value back that is different but valid for OccupiedCoolingSetpoint attribute\n");
            if (ShouldSkip("TSTAT.S.F01")) {
                NextTest();
                return;
            }
            err = TestWritesAValueBackThatIsDifferentButValidForOccupiedCoolingSetpointAttribute_2();
            break;
        case 3:
            ChipLogProgress(chipTool,
                " ***** Test Step 3 : Reads it back again to confirm the successful write of OccupiedCoolingSetpoint attribute\n");
            if (ShouldSkip("TSTAT.S.F01")) {
                NextTest();
                return;
            }
            err = TestReadsItBackAgainToConfirmTheSuccessfulWriteOfOccupiedCoolingSetpointAttribute_3();
            break;
        case 4:
            ChipLogProgress(
                chipTool, " ***** Test Step 4 : Writes OccupiedCoolingSetpoint to value below the ABSMinCoolSetpointLimit\n");
            if (ShouldSkip("TSTAT.S.F01")) {
                NextTest();
                return;
            }
            err = TestWritesOccupiedCoolingSetpointToValueBelowTheABSMinCoolSetpointLimit_4();
            break;
        case 5:
            ChipLogProgress(
                chipTool, " ***** Test Step 5 : Writes OccupiedCoolingSetpoint to value above the MaxCoolSetpointLimit\n");
            if (ShouldSkip("TSTAT.S.F01")) {
                NextTest();
                return;
            }
            err = TestWritesOccupiedCoolingSetpointToValueAboveTheMaxCoolSetpointLimit_5();
            break;
        case 6:
            ChipLogProgress(
                chipTool, " ***** Test Step 6 : Writes the limit of MinCoolSetpointLimit to OccupiedCoolingSetpoint attribute\n");
            if (ShouldSkip("TSTAT.S.F01 && !TSTAT.S.F05")) {
                NextTest();
                return;
            }
            err = TestWritesTheLimitOfMinCoolSetpointLimitToOccupiedCoolingSetpointAttribute_6();
            break;
        case 7:
            ChipLogProgress(
                chipTool, " ***** Test Step 7 : Writes the CoolingSetpoint below the HeatingSetpoint when auto is enabled\n");
            if (ShouldSkip("TSTAT.S.F05")) {
                NextTest();
                return;
            }
            err = TestWritesTheCoolingSetpointBelowTheHeatingSetpointWhenAutoIsEnabled_7();
            break;
        case 8:
            ChipLogProgress(
                chipTool, " ***** Test Step 8 : Writes the limit of MaxCoolSetpointLimit to OccupiedCoolingSetpoint attribute\n");
            if (ShouldSkip("TSTAT.S.F01")) {
                NextTest();
                return;
            }
            err = TestWritesTheLimitOfMaxCoolSetpointLimitToOccupiedCoolingSetpointAttribute_8();
            break;
        case 9:
            ChipLogProgress(chipTool,
                " ***** Test Step 9 : Reads OccupiedHeatingSetpoint attribute from Server DUT and verifies that the value is "
                "within range\n");
            if (ShouldSkip("TSTAT.S.F00")) {
                NextTest();
                return;
            }
            err = TestReadsOccupiedHeatingSetpointAttributeFromServerDutAndVerifiesThatTheValueIsWithinRange_9();
            break;
        case 10:
            ChipLogProgress(chipTool,
                " ***** Test Step 10 : Writes a value back that is different but valid for OccupiedHeatingSetpoint attribute\n");
            if (ShouldSkip("TSTAT.S.F00")) {
                NextTest();
                return;
            }
            err = TestWritesAValueBackThatIsDifferentButValidForOccupiedHeatingSetpointAttribute_10();
            break;
        case 11:
            ChipLogProgress(chipTool,
                " ***** Test Step 11 : Reads it back again to confirm the successful write of OccupiedHeatingSetpoint attribute\n");
            if (ShouldSkip("TSTAT.S.F00")) {
                NextTest();
                return;
            }
            err = TestReadsItBackAgainToConfirmTheSuccessfulWriteOfOccupiedHeatingSetpointAttribute_11();
            break;
        case 12:
            ChipLogProgress(
                chipTool, " ***** Test Step 12 : Writes OccupiedHeatingSetpoint to value below the MinHeatSetpointLimit\n");
            if (ShouldSkip("TSTAT.S.F00")) {
                NextTest();
                return;
            }
            err = TestWritesOccupiedHeatingSetpointToValueBelowTheMinHeatSetpointLimit_12();
            break;
        case 13:
            ChipLogProgress(
                chipTool, " ***** Test Step 13 : Writes OccupiedHeatingSetpoint to value above the MaxHeatSetpointLimit\n");
            if (ShouldSkip("TSTAT.S.F00")) {
                NextTest();
                return;
            }
            err = TestWritesOccupiedHeatingSetpointToValueAboveTheMaxHeatSetpointLimit_13();
            break;
        case 14:
            ChipLogProgress(
                chipTool, " ***** Test Step 14 : Writes the limit of MinHeatSetpointLimit to OccupiedHeatingSetpoint attribute\n");
            if (ShouldSkip("TSTAT.S.F00")) {
                NextTest();
                return;
            }
            err = TestWritesTheLimitOfMinHeatSetpointLimitToOccupiedHeatingSetpointAttribute_14();
            break;
        case 15:
            ChipLogProgress(chipTool,
                " ***** Test Step 15 : Reads it back again to confirm the successful write of OccupiedHeatingSetpoint attribute\n");
            if (ShouldSkip("TSTAT.S.F00")) {
                NextTest();
                return;
            }
            err = TestReadsItBackAgainToConfirmTheSuccessfulWriteOfOccupiedHeatingSetpointAttribute_15();
            break;
        case 16:
            ChipLogProgress(
                chipTool, " ***** Test Step 16 : Writes the limit of MaxHeatSetpointLimit to OccupiedHeatingSetpoint attribute\n");
            if (ShouldSkip("TSTAT.S.F00 && !TSTAT.S.F05")) {
                NextTest();
                return;
            }
            err = TestWritesTheLimitOfMaxHeatSetpointLimitToOccupiedHeatingSetpointAttribute_16();
            break;
        case 17:
            ChipLogProgress(
                chipTool, " ***** Test Step 17 : Writes the limit of MaxHeatSetpointLimit to OccupiedHeatingSetpoint attribute\n");
            if (ShouldSkip("TSTAT.S.F05")) {
                NextTest();
                return;
            }
            err = TestWritesTheLimitOfMaxHeatSetpointLimitToOccupiedHeatingSetpointAttribute_17();
            break;
        case 18:
            ChipLogProgress(chipTool,
                " ***** Test Step 18 : Reads UnoccupiedCoolingSetpoint attribute from Server DUT and verifies that the value is "
                "within range\n");
            if (ShouldSkip("TSTAT.S.F02 && TSTAT.S.F01")) {
                NextTest();
                return;
            }
            err = TestReadsUnoccupiedCoolingSetpointAttributeFromServerDutAndVerifiesThatTheValueIsWithinRange_18();
            break;
        case 19:
            ChipLogProgress(chipTool,
                " ***** Test Step 19 : Writes a value back that is different but valid for UnoccupiedCoolingSetpoint attribute\n");
            if (ShouldSkip("TSTAT.S.F02 && TSTAT.S.F01")) {
                NextTest();
                return;
            }
            err = TestWritesAValueBackThatIsDifferentButValidForUnoccupiedCoolingSetpointAttribute_19();
            break;
        case 20:
            ChipLogProgress(chipTool,
                " ***** Test Step 20 : Reads it back again to confirm the successful write of UnoccupiedCoolingSetpoint "
                "attribute\n");
            if (ShouldSkip("TSTAT.S.F02 && TSTAT.S.F01")) {
                NextTest();
                return;
            }
            err = TestReadsItBackAgainToConfirmTheSuccessfulWriteOfUnoccupiedCoolingSetpointAttribute_20();
            break;
        case 21:
            ChipLogProgress(
                chipTool, " ***** Test Step 21 : Writes UnoccupiedCoolingSetpoint to value below the MinCoolSetpointLimit\n");
            if (ShouldSkip("TSTAT.S.F02 && TSTAT.S.F01")) {
                NextTest();
                return;
            }
            err = TestWritesUnoccupiedCoolingSetpointToValueBelowTheMinCoolSetpointLimit_21();
            break;
        case 22:
            ChipLogProgress(
                chipTool, " ***** Test Step 22 : Writes UnoccupiedCoolingSetpoint to value above the MaxCoolSetpointLimit\n");
            if (ShouldSkip("TSTAT.S.F02 && TSTAT.S.F01")) {
                NextTest();
                return;
            }
            err = TestWritesUnoccupiedCoolingSetpointToValueAboveTheMaxCoolSetpointLimit_22();
            break;
        case 23:
            ChipLogProgress(chipTool,
                " ***** Test Step 23 : Writes the limit of MinCoolSetpointLimit to UnoccupiedCoolingSetpoint attribute\n");
            if (ShouldSkip("TSTAT.S.F02 && TSTAT.S.F01")) {
                NextTest();
                return;
            }
            err = TestWritesTheLimitOfMinCoolSetpointLimitToUnoccupiedCoolingSetpointAttribute_23();
            break;
        case 24:
            ChipLogProgress(chipTool,
                " ***** Test Step 24 : Writes the limit of MaxCoolSetpointLimit to UnoccupiedCoolingSetpoint attribute\n");
            if (ShouldSkip("TSTAT.S.F02 && TSTAT.S.F01")) {
                NextTest();
                return;
            }
            err = TestWritesTheLimitOfMaxCoolSetpointLimitToUnoccupiedCoolingSetpointAttribute_24();
            break;
        case 25:
            ChipLogProgress(chipTool,
                " ***** Test Step 25 : Reads UnoccupiedHeatingSetpoint attribute from Server DUT and verifies that the value is "
                "within range\n");
            if (ShouldSkip("TSTAT.S.F02 && TSTAT.S.F00")) {
                NextTest();
                return;
            }
            err = TestReadsUnoccupiedHeatingSetpointAttributeFromServerDutAndVerifiesThatTheValueIsWithinRange_25();
            break;
        case 26:
            ChipLogProgress(chipTool,
                " ***** Test Step 26 : Writes a value back that is different but valid for UnoccupiedHeatingSetpoint attribute\n");
            if (ShouldSkip("TSTAT.S.F02 && TSTAT.S.F00")) {
                NextTest();
                return;
            }
            err = TestWritesAValueBackThatIsDifferentButValidForUnoccupiedHeatingSetpointAttribute_26();
            break;
        case 27:
            ChipLogProgress(chipTool,
                " ***** Test Step 27 : Reads it back again to confirm the successful write of UnoccupiedHeatingSetpoint "
                "attribute\n");
            if (ShouldSkip("TSTAT.S.F02 && TSTAT.S.F00")) {
                NextTest();
                return;
            }
            err = TestReadsItBackAgainToConfirmTheSuccessfulWriteOfUnoccupiedHeatingSetpointAttribute_27();
            break;
        case 28:
            ChipLogProgress(
                chipTool, " ***** Test Step 28 : Writes UnoccupiedHeatingSetpoint to value below the MinHeatSetpointLimit\n");
            if (ShouldSkip("TSTAT.S.F02 && TSTAT.S.F00")) {
                NextTest();
                return;
            }
            err = TestWritesUnoccupiedHeatingSetpointToValueBelowTheMinHeatSetpointLimit_28();
            break;
        case 29:
            ChipLogProgress(
                chipTool, " ***** Test Step 29 : Writes UnoccupiedHeatingSetpoint to value above the MaxHeatSetpointLimit\n");
            if (ShouldSkip("TSTAT.S.F02 && TSTAT.S.F00")) {
                NextTest();
                return;
            }
            err = TestWritesUnoccupiedHeatingSetpointToValueAboveTheMaxHeatSetpointLimit_29();
            break;
        case 30:
            ChipLogProgress(chipTool,
                " ***** Test Step 30 : Writes the limit of MinHeatSetpointLimit to UnoccupiedHeatingSetpoint attribute\n");
            if (ShouldSkip("TSTAT.S.F02 && TSTAT.S.F00")) {
                NextTest();
                return;
            }
            err = TestWritesTheLimitOfMinHeatSetpointLimitToUnoccupiedHeatingSetpointAttribute_30();
            break;
        case 31:
            ChipLogProgress(chipTool,
                " ***** Test Step 31 : Writes the limit of MaxHeatSetpointLimit to UnoccupiedHeatingSetpoint attribute\n");
            if (ShouldSkip("TSTAT.S.F02 && TSTAT.S.F00")) {
                NextTest();
                return;
            }
            err = TestWritesTheLimitOfMaxHeatSetpointLimitToUnoccupiedHeatingSetpointAttribute_31();
            break;
        case 32:
            ChipLogProgress(chipTool,
                " ***** Test Step 32 : Reads MinHeatSetpointLimit attribute from Server DUT and verifies that the value is within "
                "range\n");
            if (ShouldSkip("TSTAT.S.F00 && TSTAT.S.A0015")) {
                NextTest();
                return;
            }
            err = TestReadsMinHeatSetpointLimitAttributeFromServerDutAndVerifiesThatTheValueIsWithinRange_32();
            break;
        case 33:
            ChipLogProgress(chipTool,
                " ***** Test Step 33 : Writes a value back that is different but valid for MinHeatSetpointLimit attribute\n");
            if (ShouldSkip("TSTAT.S.F00 && TSTAT.S.A0015")) {
                NextTest();
                return;
            }
            err = TestWritesAValueBackThatIsDifferentButValidForMinHeatSetpointLimitAttribute_33();
            break;
        case 34:
            ChipLogProgress(chipTool,
                " ***** Test Step 34 : Reads it back again to confirm the successful write of MinHeatSetpointLimit attribute\n");
            if (ShouldSkip("TSTAT.S.F00  && TSTAT.S.A0015")) {
                NextTest();
                return;
            }
            err = TestReadsItBackAgainToConfirmTheSuccessfulWriteOfMinHeatSetpointLimitAttribute_34();
            break;
        case 35:
            ChipLogProgress(chipTool, " ***** Test Step 35 : Writes a value back that is different but violates the deadband\n");
            if (ShouldSkip("TSTAT.S.A0015 && TSTAT.S.F05")) {
                NextTest();
                return;
            }
            err = TestWritesAValueBackThatIsDifferentButViolatesTheDeadband_35();
            break;
        case 36:
            ChipLogProgress(
                chipTool, " ***** Test Step 36 : Writes MinHeatSetpointLimit to value below the AbsMinHeatSetpointLimit \n");
            if (ShouldSkip("TSTAT.S.F00 && TSTAT.S.A0015")) {
                NextTest();
                return;
            }
            err = TestWritesMinHeatSetpointLimitToValueBelowTheAbsMinHeatSetpointLimit_36();
            break;
        case 37:
            ChipLogProgress(
                chipTool, " ***** Test Step 37 : Writes MinHeatSetpointLimit to value above the AbsMaxHeatSetpointLimit \n");
            if (ShouldSkip("TSTAT.S.F00  && TSTAT.S.A0015")) {
                NextTest();
                return;
            }
            err = TestWritesMinHeatSetpointLimitToValueAboveTheAbsMaxHeatSetpointLimit_37();
            break;
        case 38:
            ChipLogProgress(
                chipTool, " ***** Test Step 38 : Writes the limit of AbsMinHeatSetpointLimit to MinHeatSetpointLimit attribute\n");
            if (ShouldSkip("TSTAT.S.F00  && TSTAT.S.A0015")) {
                NextTest();
                return;
            }
            err = TestWritesTheLimitOfAbsMinHeatSetpointLimitToMinHeatSetpointLimitAttribute_38();
            break;
        case 39:
            ChipLogProgress(
                chipTool, " ***** Test Step 39 : Writes the limit of AbsMaxHeatSetpointLimit to MinHeatSetpointLimit attribute\n");
            if (ShouldSkip("TSTAT.S.F00  && TSTAT.S.A0015 && !TSTAT.S.F05")) {
                NextTest();
                return;
            }
            err = TestWritesTheLimitOfAbsMaxHeatSetpointLimitToMinHeatSetpointLimitAttribute_39();
            break;
        case 40:
            ChipLogProgress(chipTool,
                " ***** Test Step 40 : Reads MaxHeatSetpointLimit attribute from Server DUT and verifies that the value is within "
                "range\n");
            if (ShouldSkip("TSTAT.S.F00  && TSTAT.S.A0016 && !TSTAT.S.F05")) {
                NextTest();
                return;
            }
            err = TestReadsMaxHeatSetpointLimitAttributeFromServerDutAndVerifiesThatTheValueIsWithinRange_40();
            break;
        case 41:
            ChipLogProgress(
                chipTool, " ***** Test Step 41 : Writes the limit of AbsMinHeatSetpointLimit to MinHeatSetpointLimit attribute\n");
            if (ShouldSkip("TSTAT.S.F00  && TSTAT.S.A0015")) {
                NextTest();
                return;
            }
            err = TestWritesTheLimitOfAbsMinHeatSetpointLimitToMinHeatSetpointLimitAttribute_41();
            break;
        case 42:
            ChipLogProgress(
                chipTool, " ***** Test Step 42 : Writes the limit of AbsMaxHeatSetpointLimit to MinHeatSetpointLimit attribute\n");
            if (ShouldSkip("TSTAT.S.A0015 && TSTAT.S.F05")) {
                NextTest();
                return;
            }
            err = TestWritesTheLimitOfAbsMaxHeatSetpointLimitToMinHeatSetpointLimitAttribute_42();
            break;
        case 43:
            ChipLogProgress(chipTool,
                " ***** Test Step 43 : Writes a value back that is different but valid for MaxHeatSetpointLimit attribute\n");
            if (ShouldSkip("TSTAT.S.F00 && TSTAT.S.A0016 && !TSTAT.S.F05")) {
                NextTest();
                return;
            }
            err = TestWritesAValueBackThatIsDifferentButValidForMaxHeatSetpointLimitAttribute_43();
            break;
        case 44:
            ChipLogProgress(chipTool,
                " ***** Test Step 44 : Reads it back again to confirm the successful write of MaxHeatSetpointLimit attribute\n");
            if (ShouldSkip("TSTAT.S.F00 && TSTAT.S.A0016 && !TSTAT.S.F05")) {
                NextTest();
                return;
            }
            err = TestReadsItBackAgainToConfirmTheSuccessfulWriteOfMaxHeatSetpointLimitAttribute_44();
            break;
        case 45:
            ChipLogProgress(
                chipTool, " ***** Test Step 45 : Writes MaxHeatSetpointLimit to value below the AbsMinHeatSetpointLimit \n");
            if (ShouldSkip("TSTAT.S.F00  && TSTAT.S.A0016")) {
                NextTest();
                return;
            }
            err = TestWritesMaxHeatSetpointLimitToValueBelowTheAbsMinHeatSetpointLimit_45();
            break;
        case 46:
            ChipLogProgress(
                chipTool, " ***** Test Step 46 : Writes MaxHeatSetpointLimit to value above the AbsMaxHeatSetpointLimit \n");
            if (ShouldSkip("TSTAT.S.F00  && TSTAT.S.A0016")) {
                NextTest();
                return;
            }
            err = TestWritesMaxHeatSetpointLimitToValueAboveTheAbsMaxHeatSetpointLimit_46();
            break;
        case 47:
            ChipLogProgress(
                chipTool, " ***** Test Step 47 : Writes the limit of AbsMinHeatSetpointLimit to MaxHeatSetpointLimit attribute\n");
            if (ShouldSkip("TSTAT.S.F00  && TSTAT.S.A0016")) {
                NextTest();
                return;
            }
            err = TestWritesTheLimitOfAbsMinHeatSetpointLimitToMaxHeatSetpointLimitAttribute_47();
            break;
        case 48:
            ChipLogProgress(
                chipTool, " ***** Test Step 48 : Writes the limit of AbsMaxHeatSetpointLimit to MaxHeatSetpointLimit attribute\n");
            if (ShouldSkip("TSTAT.S.F00  && TSTAT.S.A0016 && !TSTAT.S.F05")) {
                NextTest();
                return;
            }
            err = TestWritesTheLimitOfAbsMaxHeatSetpointLimitToMaxHeatSetpointLimitAttribute_48();
            break;
        case 49:
            ChipLogProgress(chipTool,
                " ***** Test Step 49 : Reads MinCoolSetpointLimit attribute from Server DUT and verifies that the value is within "
                "range\n");
            if (ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017")) {
                NextTest();
                return;
            }
            err = TestReadsMinCoolSetpointLimitAttributeFromServerDutAndVerifiesThatTheValueIsWithinRange_49();
            break;
        case 50:
            ChipLogProgress(chipTool,
                " ***** Test Step 50 : Writes a value back that is different but valid for MinCoolSetpointLimit attribute\n");
            if (ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017")) {
                NextTest();
                return;
            }
            err = TestWritesAValueBackThatIsDifferentButValidForMinCoolSetpointLimitAttribute_50();
            break;
        case 51:
            ChipLogProgress(chipTool,
                " ***** Test Step 51 : Reads it back again to confirm the successful write of MinCoolSetpointLimit attribute\n");
            if (ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017")) {
                NextTest();
                return;
            }
            err = TestReadsItBackAgainToConfirmTheSuccessfulWriteOfMinCoolSetpointLimitAttribute_51();
            break;
        case 52:
            ChipLogProgress(
                chipTool, " ***** Test Step 52 : Writes MinCoolSetpointLimit to value below the AbsMinCoolSetpointLimit \n");
            if (ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017")) {
                NextTest();
                return;
            }
            err = TestWritesMinCoolSetpointLimitToValueBelowTheAbsMinCoolSetpointLimit_52();
            break;
        case 53:
            ChipLogProgress(
                chipTool, " ***** Test Step 53 : Writes MinCoolSetpointLimit to value above the MaxCoolSetpointLimit \n");
            if (ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017")) {
                NextTest();
                return;
            }
            err = TestWritesMinCoolSetpointLimitToValueAboveTheMaxCoolSetpointLimit_53();
            break;
        case 54:
            ChipLogProgress(
                chipTool, " ***** Test Step 54 : Writes the limit of AbsMinCoolSetpointLimit to MinCoolSetpointLimit attribute\n");
            if (ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017")) {
                NextTest();
                return;
            }
            err = TestWritesTheLimitOfAbsMinCoolSetpointLimitToMinCoolSetpointLimitAttribute_54();
            break;
        case 55:
            ChipLogProgress(
                chipTool, " ***** Test Step 55 : Writes the limit of MaxCoolSetpointLimit to MinCoolSetpointLimit attribute\n");
            if (ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017")) {
                NextTest();
                return;
            }
            err = TestWritesTheLimitOfMaxCoolSetpointLimitToMinCoolSetpointLimitAttribute_55();
            break;
        case 56:
            ChipLogProgress(
                chipTool, " ***** Test Step 56 : Writes the limit of AbsMinCoolSetpointLimit to MinCoolSetpointLimit attribute\n");
            if (ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017")) {
                NextTest();
                return;
            }
            err = TestWritesTheLimitOfAbsMinCoolSetpointLimitToMinCoolSetpointLimitAttribute_56();
            break;
        case 57:
            ChipLogProgress(chipTool,
                " ***** Test Step 57 : Reads MaxCoolSetpointLimit attribute from Server DUT and verifies that the value is within "
                "range\n");
            if (ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0018")) {
                NextTest();
                return;
            }
            err = TestReadsMaxCoolSetpointLimitAttributeFromServerDutAndVerifiesThatTheValueIsWithinRange_57();
            break;
        case 58:
            ChipLogProgress(chipTool,
                " ***** Test Step 58 : Writes a value back that is different but valid for MaxCoolSetpointLimit attribute\n");
            if (ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0018 && !TSTAT.S.F05")) {
                NextTest();
                return;
            }
            err = TestWritesAValueBackThatIsDifferentButValidForMaxCoolSetpointLimitAttribute_58();
            break;
        case 59:
            ChipLogProgress(chipTool,
                " ***** Test Step 59 : Reads it back again to confirm the successful write of MaxCoolSetpointLimit attribute\n");
            if (ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0018 && !TSTAT.S.F05")) {
                NextTest();
                return;
            }
            err = TestReadsItBackAgainToConfirmTheSuccessfulWriteOfMaxCoolSetpointLimitAttribute_59();
            break;
        case 60:
            ChipLogProgress(
                chipTool, " ***** Test Step 60 : Writes MaxCoolSetpointLimit to value below the AbsMinCoolSetpointLimit \n");
            if (ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0018")) {
                NextTest();
                return;
            }
            err = TestWritesMaxCoolSetpointLimitToValueBelowTheAbsMinCoolSetpointLimit_60();
            break;
        case 61:
            ChipLogProgress(
                chipTool, " ***** Test Step 61 : Writes MaxCoolSetpointLimit to value above the MaxCoolSetpointLimit \n");
            if (ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0018")) {
                NextTest();
                return;
            }
            err = TestWritesMaxCoolSetpointLimitToValueAboveTheMaxCoolSetpointLimit_61();
            break;
        case 62:
            ChipLogProgress(
                chipTool, " ***** Test Step 62 : Writes the limit of AbsMinCoolSetpointLimit to MaxCoolSetpointLimit attribute\n");
            if (ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0018")) {
                NextTest();
                return;
            }
            err = TestWritesTheLimitOfAbsMinCoolSetpointLimitToMaxCoolSetpointLimitAttribute_62();
            break;
        case 63:
            ChipLogProgress(
                chipTool, " ***** Test Step 63 : Writes the limit of MaxCoolSetpointLimit to MaxCoolSetpointLimit attribute\n");
            if (ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0018")) {
                NextTest();
                return;
            }
            err = TestWritesTheLimitOfMaxCoolSetpointLimitToMaxCoolSetpointLimitAttribute_63();
            break;
        case 64:
            ChipLogProgress(chipTool, " ***** Test Step 64 : Writes (sets back) default value of MinHeatSetpointLimit\n");
            if (ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0015")) {
                NextTest();
                return;
            }
            err = TestWritesSetsBackDefaultValueOfMinHeatSetpointLimit_64();
            break;
        case 65:
            ChipLogProgress(chipTool, " ***** Test Step 65 : Writes (sets back)default value of MaxHeatSetpointLimit\n");
            if (ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0016 &&!TSTAT.S.F05")) {
                NextTest();
                return;
            }
            err = TestWritesSetsBackdefaultValueOfMaxHeatSetpointLimit_65();
            break;
        case 66:
            ChipLogProgress(chipTool, " ***** Test Step 66 : Writes MaxHeatSetpointLimit That meets the deadband of 2.5C\n");
            if (ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0016 &&!TSTAT.S.F05")) {
                NextTest();
                return;
            }
            err = TestWritesMaxHeatSetpointLimitThatMeetsTheDeadbandOf25c_66();
            break;
        case 67:
            ChipLogProgress(chipTool, " ***** Test Step 67 : Writes (sets back) default value of MinCoolSetpointLimit\n");
            if (ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017")) {
                NextTest();
                return;
            }
            err = TestWritesSetsBackDefaultValueOfMinCoolSetpointLimit_67();
            break;
        case 68:
            ChipLogProgress(chipTool, " ***** Test Step 68 : Writes (sets back) default value of MaxCoolSetpointLimit\n");
            if (ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0018")) {
                NextTest();
                return;
            }
            err = TestWritesSetsBackDefaultValueOfMaxCoolSetpointLimit_68();
            break;
        case 69:
            ChipLogProgress(chipTool,
                " ***** Test Step 69 : Reads MinSetpointDeadBand attribute from Server DUT and verifies that the value is within "
                "range\n");
            if (ShouldSkip("TSTAT.S.F05")) {
                NextTest();
                return;
            }
            err = TestReadsMinSetpointDeadBandAttributeFromServerDutAndVerifiesThatTheValueIsWithinRange_69();
            break;
        case 70:
            ChipLogProgress(chipTool,
                " ***** Test Step 70 : Writes a value back that is different but valid for MinSetpointDeadBand attribute\n");
            if (ShouldSkip("TSTAT.S.F05")) {
                NextTest();
                return;
            }
            err = TestWritesAValueBackThatIsDifferentButValidForMinSetpointDeadBandAttribute_70();
            break;
        case 71:
            ChipLogProgress(chipTool,
                " ***** Test Step 71 : Reads it back again to confirm the successful write of MinSetpointDeadBand attribute\n");
            if (ShouldSkip("TSTAT.S.F05")) {
                NextTest();
                return;
            }
            err = TestReadsItBackAgainToConfirmTheSuccessfulWriteOfMinSetpointDeadBandAttribute_71();
            break;
        case 72:
            ChipLogProgress(chipTool, " ***** Test Step 72 : Writes the value below MinSetpointDeadBand\n");
            if (ShouldSkip("TSTAT.S.F05")) {
                NextTest();
                return;
            }
            err = TestWritesTheValueBelowMinSetpointDeadBand_72();
            break;
        case 73:
            ChipLogProgress(chipTool, " ***** Test Step 73 : Writes the value above MinSetpointDeadBand \n");
            if (ShouldSkip("TSTAT.S.F05")) {
                NextTest();
                return;
            }
            err = TestWritesTheValueAboveMinSetpointDeadBand_73();
            break;
        case 74:
            ChipLogProgress(chipTool, " ***** Test Step 74 : Writes the min limit of MinSetpointDeadBand\n");
            if (ShouldSkip("TSTAT.S.F05")) {
                NextTest();
                return;
            }
            err = TestWritesTheMinLimitOfMinSetpointDeadBand_74();
            break;
        case 75:
            ChipLogProgress(chipTool, " ***** Test Step 75 : Writes the max limit of MinSetpointDeadBand\n");
            if (ShouldSkip("TSTAT.S.F05")) {
                NextTest();
                return;
            }
            err = TestWritesTheMaxLimitOfMinSetpointDeadBand_75();
            break;
        case 76:
            ChipLogProgress(chipTool,
                " ***** Test Step 76 : Reads ControlSequenceOfOperation from Server DUT and verifies that the value is valid\n");
            if (ShouldSkip("TSTAT.S.F00 || TSTAT.S.F01")) {
                NextTest();
                return;
            }
            err = TestReadsControlSequenceOfOperationFromServerDutAndVerifiesThatTheValueIsValid_76();
            break;
        case 77:
            ChipLogProgress(
                chipTool, " ***** Test Step 77 : Write Attribute command for ControlSequenceOfOperation with a new valid value\n");
            if (ShouldSkip("TSTAT.S.F00 || TSTAT.S.F01")) {
                NextTest();
                return;
            }
            err = TestWriteAttributeCommandForControlSequenceOfOperationWithANewValidValue_77();
            break;
        case 78:
            ChipLogProgress(chipTool, " ***** Test Step 78 : Read it back again to confirm the successful write\n");
            if (ShouldSkip("TSTAT.S.F00 || TSTAT.S.F01")) {
                NextTest();
                return;
            }
            err = TestReadItBackAgainToConfirmTheSuccessfulWrite_78();
            break;
        case 79:
            ChipLogProgress(chipTool,
                " ***** Test Step 79 : Writes MaxHeatSetpointLimit attribute to default value of 2950 to meet deadband "
                "constraint\n");
            if (ShouldSkip("TSTAT.S.F00 && TSTAT.S.A0015 && TSTAT.S.F05")) {
                NextTest();
                return;
            }
            err = TestWritesMaxHeatSetpointLimitAttributeToDefaultValueOf2950ToMeetDeadbandConstraint_79();
            break;
        case 80:
            ChipLogProgress(chipTool, " ***** Test Step 80 : Sets OccupiedCoolingSetpoint to default value\n");
            if (ShouldSkip("TSTAT.S.F01")) {
                NextTest();
                return;
            }
            err = TestSetsOccupiedCoolingSetpointToDefaultValue_80();
            break;
        case 81:
            ChipLogProgress(chipTool, " ***** Test Step 81 : Sets OccupiedHeatingSetpoint to default value\n");
            if (ShouldSkip("TSTAT.S.F00")) {
                NextTest();
                return;
            }
            err = TestSetsOccupiedHeatingSetpointToDefaultValue_81();
            break;
        case 82:
            ChipLogProgress(chipTool, " ***** Test Step 82 : Sends SetpointRaise Command Heat Only\n");
            if (ShouldSkip("TSTAT.S.F00")) {
                NextTest();
                return;
            }
            err = TestSendsSetpointRaiseCommandHeatOnly_82();
            break;
        case 83:
            ChipLogProgress(
                chipTool, " ***** Test Step 83 : Reads back OccupiedHeatingSetpoint to confirm the success of the write\n");
            if (ShouldSkip("TSTAT.S.F00")) {
                NextTest();
                return;
            }
            err = TestReadsBackOccupiedHeatingSetpointToConfirmTheSuccessOfTheWrite_83();
            break;
        case 84:
            ChipLogProgress(chipTool, " ***** Test Step 84 : Sets OccupiedHeatingSetpoint to default value\n");
            if (ShouldSkip("TSTAT.S.F00")) {
                NextTest();
                return;
            }
            err = TestSetsOccupiedHeatingSetpointToDefaultValue_84();
            break;
        case 85:
            ChipLogProgress(chipTool, " ***** Test Step 85 : Sends SetpointRaise Command Heat Only\n");
            if (ShouldSkip("TSTAT.S.F00")) {
                NextTest();
                return;
            }
            err = TestSendsSetpointRaiseCommandHeatOnly_85();
            break;
        case 86:
            ChipLogProgress(
                chipTool, " ***** Test Step 86 : Reads back OccupiedHeatingSetpoint to confirm the success of the write\n");
            if (ShouldSkip("TSTAT.S.F00")) {
                NextTest();
                return;
            }
            err = TestReadsBackOccupiedHeatingSetpointToConfirmTheSuccessOfTheWrite_86();
            break;
        case 87:
            ChipLogProgress(chipTool, " ***** Test Step 87 : Sends SetpointRaise Command Cool Only\n");
            if (ShouldSkip("TSTAT.S.F01")) {
                NextTest();
                return;
            }
            err = TestSendsSetpointRaiseCommandCoolOnly_87();
            break;
        case 88:
            ChipLogProgress(
                chipTool, " ***** Test Step 88 : Reads back OccupiedCoolingSetpoint to confirm the success of the write\n");
            if (ShouldSkip("TSTAT.S.F01")) {
                NextTest();
                return;
            }
            err = TestReadsBackOccupiedCoolingSetpointToConfirmTheSuccessOfTheWrite_88();
            break;
        case 89:
            ChipLogProgress(chipTool, " ***** Test Step 89 : Sets OccupiedCoolingSetpoint to default value\n");
            if (ShouldSkip("TSTAT.S.F01")) {
                NextTest();
                return;
            }
            err = TestSetsOccupiedCoolingSetpointToDefaultValue_89();
            break;
        case 90:
            ChipLogProgress(chipTool, " ***** Test Step 90 : Sends SetpointRaise Command Cool Only\n");
            if (ShouldSkip("TSTAT.S.F01")) {
                NextTest();
                return;
            }
            err = TestSendsSetpointRaiseCommandCoolOnly_90();
            break;
        case 91:
            ChipLogProgress(
                chipTool, " ***** Test Step 91 : Reads back OccupiedCoolingSetpoint to confirm the success of the write\n");
            if (ShouldSkip("TSTAT.S.F01")) {
                NextTest();
                return;
            }
            err = TestReadsBackOccupiedCoolingSetpointToConfirmTheSuccessOfTheWrite_91();
            break;
        case 92:
            ChipLogProgress(chipTool, " ***** Test Step 92 : Sets OccupiedCoolingSetpoint to default value\n");
            if (ShouldSkip("TSTAT.S.F01")) {
                NextTest();
                return;
            }
            err = TestSetsOccupiedCoolingSetpointToDefaultValue_92();
            break;
        case 93:
            ChipLogProgress(chipTool, " ***** Test Step 93 : Sets OccupiedHeatingSetpoint to default value\n");
            if (ShouldSkip("TSTAT.S.F00")) {
                NextTest();
                return;
            }
            err = TestSetsOccupiedHeatingSetpointToDefaultValue_93();
            break;
        case 94:
            ChipLogProgress(chipTool, " ***** Test Step 94 : Sends SetpointRaise Command Heat & Cool\n");
            if (ShouldSkip("TSTAT.S.F00 || TSTAT.S.F01")) {
                NextTest();
                return;
            }
            err = TestSendsSetpointRaiseCommandHeatCool_94();
            break;
        case 95:
            ChipLogProgress(
                chipTool, " ***** Test Step 95 : Reads back OccupiedCoolingSetpoint to confirm the success of the write\n");
            if (ShouldSkip("TSTAT.S.F01")) {
                NextTest();
                return;
            }
            err = TestReadsBackOccupiedCoolingSetpointToConfirmTheSuccessOfTheWrite_95();
            break;
        case 96:
            ChipLogProgress(
                chipTool, " ***** Test Step 96 : Reads back OccupiedHeatingSetpoint to confirm the success of the write\n");
            if (ShouldSkip("TSTAT.S.F00")) {
                NextTest();
                return;
            }
            err = TestReadsBackOccupiedHeatingSetpointToConfirmTheSuccessOfTheWrite_96();
            break;
        case 97:
            ChipLogProgress(chipTool, " ***** Test Step 97 : Sets OccupiedCoolingSetpoint to default value\n");
            if (ShouldSkip("TSTAT.S.F01")) {
                NextTest();
                return;
            }
            err = TestSetsOccupiedCoolingSetpointToDefaultValue_97();
            break;
        case 98:
            ChipLogProgress(chipTool, " ***** Test Step 98 : Sets OccupiedHeatingSetpoint to default value\n");
            if (ShouldSkip("TSTAT.S.F00")) {
                NextTest();
                return;
            }
            err = TestSetsOccupiedHeatingSetpointToDefaultValue_98();
            break;
        case 99:
            ChipLogProgress(chipTool, " ***** Test Step 99 : Sends SetpointRaise Command Heat & Cool\n");
            if (ShouldSkip("TSTAT.S.F00 || TSTAT.S.F01")) {
                NextTest();
                return;
            }
            err = TestSendsSetpointRaiseCommandHeatCool_99();
            break;
        case 100:
            ChipLogProgress(
                chipTool, " ***** Test Step 100 : Reads back OccupiedCoolingSetpoint to confirm the success of the write\n");
            if (ShouldSkip("TSTAT.S.F01")) {
                NextTest();
                return;
            }
            err = TestReadsBackOccupiedCoolingSetpointToConfirmTheSuccessOfTheWrite_100();
            break;
        case 101:
            ChipLogProgress(
                chipTool, " ***** Test Step 101 : Reads back OccupiedHeatingSetpoint to confirm the success of the write\n");
            if (ShouldSkip("TSTAT.S.F00")) {
                NextTest();
                return;
            }
            err = TestReadsBackOccupiedHeatingSetpointToConfirmTheSuccessOfTheWrite_101();
            break;
        }

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

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 1:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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_CONSTRAINT_ERROR));
            break;
        case 5:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 6:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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_CONSTRAINT_ERROR));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 24:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 25:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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_CONSTRAINT_ERROR));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 43:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 44:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 45:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 46:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 47:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 48:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 49:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 53:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 54:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 55:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 56:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 57:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 61:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 62:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 63:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 64:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 65:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 66:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 67:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 68:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 69:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 73:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 74:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 75:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 76:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        }

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

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

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

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

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

    CHIP_ERROR TestReadsOccupiedCoolingSetpointAttributeFromServerDutAndVerifiesThatTheValueIsWithinRange_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOccupiedCoolingSetpointWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads OccupiedCoolingSetpoint attribute from Server DUT and verifies that the value is within range Error: %@",
                err);

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

            VerifyOrReturn(CheckConstraintType("occupiedCoolingSetpoint", "int16s", "int16s"));
            VerifyOrReturn(CheckConstraintMinValue<int16_t>("occupiedCoolingSetpoint", [value shortValue], 1600));
            VerifyOrReturn(CheckConstraintMaxValue<int16_t>("occupiedCoolingSetpoint", [value shortValue], 3200));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesAValueBackThatIsDifferentButValidForOccupiedCoolingSetpointAttribute_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id occupiedCoolingSetpointArgument;
        occupiedCoolingSetpointArgument = [NSNumber numberWithShort:2500];
        [cluster writeAttributeOccupiedCoolingSetpointWithValue:occupiedCoolingSetpointArgument
                                              completionHandler:^(NSError * _Nullable err) {
                                                  NSLog(@"Writes a value back that is different but valid for "
                                                        @"OccupiedCoolingSetpoint attribute Error: %@",
                                                      err);

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

                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsItBackAgainToConfirmTheSuccessfulWriteOfOccupiedCoolingSetpointAttribute_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOccupiedCoolingSetpointWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads it back again to confirm the successful write of OccupiedCoolingSetpoint attribute Error: %@", err);

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

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OccupiedCoolingSetpoint", actualValue, 2500));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesOccupiedCoolingSetpointToValueBelowTheABSMinCoolSetpointLimit_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id occupiedCoolingSetpointArgument;
        occupiedCoolingSetpointArgument = [NSNumber numberWithShort:30];
        [cluster writeAttributeOccupiedCoolingSetpointWithValue:occupiedCoolingSetpointArgument
                                              completionHandler:^(NSError * _Nullable err) {
                                                  NSLog(@"Writes OccupiedCoolingSetpoint to value below the "
                                                        @"ABSMinCoolSetpointLimit 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 TestWritesOccupiedCoolingSetpointToValueAboveTheMaxCoolSetpointLimit_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id occupiedCoolingSetpointArgument;
        occupiedCoolingSetpointArgument = [NSNumber numberWithShort:4000];
        [cluster writeAttributeOccupiedCoolingSetpointWithValue:occupiedCoolingSetpointArgument
                                              completionHandler:^(NSError * _Nullable err) {
                                                  NSLog(@"Writes OccupiedCoolingSetpoint to value above the MaxCoolSetpointLimit "
                                                        @"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 TestWritesTheLimitOfMinCoolSetpointLimitToOccupiedCoolingSetpointAttribute_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id occupiedCoolingSetpointArgument;
        occupiedCoolingSetpointArgument = [NSNumber numberWithShort:1600];
        [cluster writeAttributeOccupiedCoolingSetpointWithValue:occupiedCoolingSetpointArgument
                                              completionHandler:^(NSError * _Nullable err) {
                                                  NSLog(@"Writes the limit of MinCoolSetpointLimit to OccupiedCoolingSetpoint "
                                                        @"attribute Error: %@",
                                                      err);

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

                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesTheCoolingSetpointBelowTheHeatingSetpointWhenAutoIsEnabled_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id occupiedCoolingSetpointArgument;
        occupiedCoolingSetpointArgument = [NSNumber numberWithShort:1600];
        [cluster writeAttributeOccupiedCoolingSetpointWithValue:occupiedCoolingSetpointArgument
                                              completionHandler:^(NSError * _Nullable err) {
                                                  NSLog(@"Writes the CoolingSetpoint below the HeatingSetpoint when auto is "
                                                        @"enabled 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 TestWritesTheLimitOfMaxCoolSetpointLimitToOccupiedCoolingSetpointAttribute_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id occupiedCoolingSetpointArgument;
        occupiedCoolingSetpointArgument = [NSNumber numberWithShort:3200];
        [cluster writeAttributeOccupiedCoolingSetpointWithValue:occupiedCoolingSetpointArgument
                                              completionHandler:^(NSError * _Nullable err) {
                                                  NSLog(@"Writes the limit of MaxCoolSetpointLimit to OccupiedCoolingSetpoint "
                                                        @"attribute Error: %@",
                                                      err);

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

                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsOccupiedHeatingSetpointAttributeFromServerDutAndVerifiesThatTheValueIsWithinRange_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOccupiedHeatingSetpointWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads OccupiedHeatingSetpoint attribute from Server DUT and verifies that the value is within range Error: %@",
                err);

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

            VerifyOrReturn(CheckConstraintType("occupiedHeatingSetpoint", "int16s", "int16s"));
            VerifyOrReturn(CheckConstraintMinValue<int16_t>("occupiedHeatingSetpoint", [value shortValue], 700));
            VerifyOrReturn(CheckConstraintMaxValue<int16_t>("occupiedHeatingSetpoint", [value shortValue], 3000));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesAValueBackThatIsDifferentButValidForOccupiedHeatingSetpointAttribute_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id occupiedHeatingSetpointArgument;
        occupiedHeatingSetpointArgument = [NSNumber numberWithShort:2100];
        [cluster writeAttributeOccupiedHeatingSetpointWithValue:occupiedHeatingSetpointArgument
                                              completionHandler:^(NSError * _Nullable err) {
                                                  NSLog(@"Writes a value back that is different but valid for "
                                                        @"OccupiedHeatingSetpoint attribute Error: %@",
                                                      err);

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

                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsItBackAgainToConfirmTheSuccessfulWriteOfOccupiedHeatingSetpointAttribute_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOccupiedHeatingSetpointWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads it back again to confirm the successful write of OccupiedHeatingSetpoint attribute Error: %@", err);

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

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OccupiedHeatingSetpoint", actualValue, 2100));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesOccupiedHeatingSetpointToValueBelowTheMinHeatSetpointLimit_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id occupiedHeatingSetpointArgument;
        occupiedHeatingSetpointArgument = [NSNumber numberWithShort:600];
        [cluster writeAttributeOccupiedHeatingSetpointWithValue:occupiedHeatingSetpointArgument
                                              completionHandler:^(NSError * _Nullable err) {
                                                  NSLog(@"Writes OccupiedHeatingSetpoint to value below the MinHeatSetpointLimit "
                                                        @"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 TestWritesOccupiedHeatingSetpointToValueAboveTheMaxHeatSetpointLimit_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id occupiedHeatingSetpointArgument;
        occupiedHeatingSetpointArgument = [NSNumber numberWithShort:4010];
        [cluster writeAttributeOccupiedHeatingSetpointWithValue:occupiedHeatingSetpointArgument
                                              completionHandler:^(NSError * _Nullable err) {
                                                  NSLog(@"Writes OccupiedHeatingSetpoint to value above the MaxHeatSetpointLimit "
                                                        @"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 TestWritesTheLimitOfMinHeatSetpointLimitToOccupiedHeatingSetpointAttribute_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id occupiedHeatingSetpointArgument;
        occupiedHeatingSetpointArgument = [NSNumber numberWithShort:700];
        [cluster writeAttributeOccupiedHeatingSetpointWithValue:occupiedHeatingSetpointArgument
                                              completionHandler:^(NSError * _Nullable err) {
                                                  NSLog(@"Writes the limit of MinHeatSetpointLimit to OccupiedHeatingSetpoint "
                                                        @"attribute Error: %@",
                                                      err);

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

                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsItBackAgainToConfirmTheSuccessfulWriteOfOccupiedHeatingSetpointAttribute_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOccupiedHeatingSetpointWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads it back again to confirm the successful write of OccupiedHeatingSetpoint attribute Error: %@", err);

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

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OccupiedHeatingSetpoint", actualValue, 700));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesTheLimitOfMaxHeatSetpointLimitToOccupiedHeatingSetpointAttribute_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id occupiedHeatingSetpointArgument;
        occupiedHeatingSetpointArgument = [NSNumber numberWithShort:3000];
        [cluster writeAttributeOccupiedHeatingSetpointWithValue:occupiedHeatingSetpointArgument
                                              completionHandler:^(NSError * _Nullable err) {
                                                  NSLog(@"Writes the limit of MaxHeatSetpointLimit to OccupiedHeatingSetpoint "
                                                        @"attribute Error: %@",
                                                      err);

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

                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesTheLimitOfMaxHeatSetpointLimitToOccupiedHeatingSetpointAttribute_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id occupiedHeatingSetpointArgument;
        occupiedHeatingSetpointArgument = [NSNumber numberWithShort:3000];
        [cluster writeAttributeOccupiedHeatingSetpointWithValue:occupiedHeatingSetpointArgument
                                              completionHandler:^(NSError * _Nullable err) {
                                                  NSLog(@"Writes the limit of MaxHeatSetpointLimit to OccupiedHeatingSetpoint "
                                                        @"attribute Error: %@",
                                                      err);

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

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsUnoccupiedCoolingSetpointAttributeFromServerDutAndVerifiesThatTheValueIsWithinRange_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeUnoccupiedCoolingSetpointWithCompletionHandler:^(
            NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(
                @"Reads UnoccupiedCoolingSetpoint attribute from Server DUT and verifies that the value is within range Error: %@",
                err);

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

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("UnoccupiedCoolingSetpoint", actualValue, 2600));
            }

            VerifyOrReturn(CheckConstraintType("unoccupiedCoolingSetpoint", "int16s", "int16s"));
            VerifyOrReturn(CheckConstraintMinValue<int16_t>("unoccupiedCoolingSetpoint", [value shortValue], 1600));
            VerifyOrReturn(CheckConstraintMaxValue<int16_t>("unoccupiedCoolingSetpoint", [value shortValue], 3200));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesAValueBackThatIsDifferentButValidForUnoccupiedCoolingSetpointAttribute_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id unoccupiedCoolingSetpointArgument;
        unoccupiedCoolingSetpointArgument = [NSNumber numberWithShort:2500];
        [cluster writeAttributeUnoccupiedCoolingSetpointWithValue:unoccupiedCoolingSetpointArgument
                                                completionHandler:^(NSError * _Nullable err) {
                                                    NSLog(@"Writes a value back that is different but valid for "
                                                          @"UnoccupiedCoolingSetpoint attribute Error: %@",
                                                        err);

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

                                                    NextTest();
                                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsItBackAgainToConfirmTheSuccessfulWriteOfUnoccupiedCoolingSetpointAttribute_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeUnoccupiedCoolingSetpointWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"Reads it back again to confirm the successful write of UnoccupiedCoolingSetpoint attribute Error: %@", err);

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

                {
                    id actualValue = value;
                    VerifyOrReturn(CheckValue("UnoccupiedCoolingSetpoint", actualValue, 2500));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesUnoccupiedCoolingSetpointToValueBelowTheMinCoolSetpointLimit_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id unoccupiedCoolingSetpointArgument;
        unoccupiedCoolingSetpointArgument = [NSNumber numberWithShort:1002];
        [cluster writeAttributeUnoccupiedCoolingSetpointWithValue:unoccupiedCoolingSetpointArgument
                                                completionHandler:^(NSError * _Nullable err) {
                                                    NSLog(@"Writes UnoccupiedCoolingSetpoint to value below the "
                                                          @"MinCoolSetpointLimit 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 TestWritesUnoccupiedCoolingSetpointToValueAboveTheMaxCoolSetpointLimit_22()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id unoccupiedCoolingSetpointArgument;
        unoccupiedCoolingSetpointArgument = [NSNumber numberWithShort:4010];
        [cluster writeAttributeUnoccupiedCoolingSetpointWithValue:unoccupiedCoolingSetpointArgument
                                                completionHandler:^(NSError * _Nullable err) {
                                                    NSLog(@"Writes UnoccupiedCoolingSetpoint to value above the "
                                                          @"MaxCoolSetpointLimit 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 TestWritesTheLimitOfMinCoolSetpointLimitToUnoccupiedCoolingSetpointAttribute_23()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id unoccupiedCoolingSetpointArgument;
        unoccupiedCoolingSetpointArgument = [NSNumber numberWithShort:1800];
        [cluster writeAttributeUnoccupiedCoolingSetpointWithValue:unoccupiedCoolingSetpointArgument
                                                completionHandler:^(NSError * _Nullable err) {
                                                    NSLog(@"Writes the limit of MinCoolSetpointLimit to UnoccupiedCoolingSetpoint "
                                                          @"attribute Error: %@",
                                                        err);

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

                                                    NextTest();
                                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesTheLimitOfMaxCoolSetpointLimitToUnoccupiedCoolingSetpointAttribute_24()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id unoccupiedCoolingSetpointArgument;
        unoccupiedCoolingSetpointArgument = [NSNumber numberWithShort:3000];
        [cluster writeAttributeUnoccupiedCoolingSetpointWithValue:unoccupiedCoolingSetpointArgument
                                                completionHandler:^(NSError * _Nullable err) {
                                                    NSLog(@"Writes the limit of MaxCoolSetpointLimit to UnoccupiedCoolingSetpoint "
                                                          @"attribute Error: %@",
                                                        err);

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

                                                    NextTest();
                                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsUnoccupiedHeatingSetpointAttributeFromServerDutAndVerifiesThatTheValueIsWithinRange_25()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeUnoccupiedHeatingSetpointWithCompletionHandler:^(
            NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(
                @"Reads UnoccupiedHeatingSetpoint attribute from Server DUT and verifies that the value is within range Error: %@",
                err);

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

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("UnoccupiedHeatingSetpoint", actualValue, 2000));
            }

            VerifyOrReturn(CheckConstraintType("unoccupiedHeatingSetpoint", "int16s", "int16s"));
            VerifyOrReturn(CheckConstraintMinValue<int16_t>("unoccupiedHeatingSetpoint", [value shortValue], 700));
            VerifyOrReturn(CheckConstraintMaxValue<int16_t>("unoccupiedHeatingSetpoint", [value shortValue], 3000));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesAValueBackThatIsDifferentButValidForUnoccupiedHeatingSetpointAttribute_26()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id unoccupiedHeatingSetpointArgument;
        unoccupiedHeatingSetpointArgument = [NSNumber numberWithShort:2500];
        [cluster writeAttributeUnoccupiedHeatingSetpointWithValue:unoccupiedHeatingSetpointArgument
                                                completionHandler:^(NSError * _Nullable err) {
                                                    NSLog(@"Writes a value back that is different but valid for "
                                                          @"UnoccupiedHeatingSetpoint attribute Error: %@",
                                                        err);

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

                                                    NextTest();
                                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsItBackAgainToConfirmTheSuccessfulWriteOfUnoccupiedHeatingSetpointAttribute_27()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeUnoccupiedHeatingSetpointWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"Reads it back again to confirm the successful write of UnoccupiedHeatingSetpoint attribute Error: %@", err);

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

                {
                    id actualValue = value;
                    VerifyOrReturn(CheckValue("UnoccupiedHeatingSetpoint", actualValue, 2500));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesUnoccupiedHeatingSetpointToValueBelowTheMinHeatSetpointLimit_28()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id unoccupiedHeatingSetpointArgument;
        unoccupiedHeatingSetpointArgument = [NSNumber numberWithShort:500];
        [cluster writeAttributeUnoccupiedHeatingSetpointWithValue:unoccupiedHeatingSetpointArgument
                                                completionHandler:^(NSError * _Nullable err) {
                                                    NSLog(@"Writes UnoccupiedHeatingSetpoint to value below the "
                                                          @"MinHeatSetpointLimit 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 TestWritesUnoccupiedHeatingSetpointToValueAboveTheMaxHeatSetpointLimit_29()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id unoccupiedHeatingSetpointArgument;
        unoccupiedHeatingSetpointArgument = [NSNumber numberWithShort:4010];
        [cluster writeAttributeUnoccupiedHeatingSetpointWithValue:unoccupiedHeatingSetpointArgument
                                                completionHandler:^(NSError * _Nullable err) {
                                                    NSLog(@"Writes UnoccupiedHeatingSetpoint to value above the "
                                                          @"MaxHeatSetpointLimit 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 TestWritesTheLimitOfMinHeatSetpointLimitToUnoccupiedHeatingSetpointAttribute_30()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id unoccupiedHeatingSetpointArgument;
        unoccupiedHeatingSetpointArgument = [NSNumber numberWithShort:1800];
        [cluster writeAttributeUnoccupiedHeatingSetpointWithValue:unoccupiedHeatingSetpointArgument
                                                completionHandler:^(NSError * _Nullable err) {
                                                    NSLog(@"Writes the limit of MinHeatSetpointLimit to UnoccupiedHeatingSetpoint "
                                                          @"attribute Error: %@",
                                                        err);

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

                                                    NextTest();
                                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesTheLimitOfMaxHeatSetpointLimitToUnoccupiedHeatingSetpointAttribute_31()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id unoccupiedHeatingSetpointArgument;
        unoccupiedHeatingSetpointArgument = [NSNumber numberWithShort:3000];
        [cluster writeAttributeUnoccupiedHeatingSetpointWithValue:unoccupiedHeatingSetpointArgument
                                                completionHandler:^(NSError * _Nullable err) {
                                                    NSLog(@"Writes the limit of MaxHeatSetpointLimit to UnoccupiedHeatingSetpoint "
                                                          @"attribute Error: %@",
                                                        err);

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

                                                    NextTest();
                                                }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsMinHeatSetpointLimitAttributeFromServerDutAndVerifiesThatTheValueIsWithinRange_32()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinHeatSetpointLimitWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(
                @"Reads MinHeatSetpointLimit attribute from Server DUT and verifies that the value is within range Error: %@", err);

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

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("MinHeatSetpointLimit", actualValue, 700));
            }

            VerifyOrReturn(CheckConstraintType("minHeatSetpointLimit", "int16s", "int16s"));
            VerifyOrReturn(CheckConstraintMinValue<int16_t>("minHeatSetpointLimit", [value shortValue], 700));
            VerifyOrReturn(CheckConstraintMaxValue<int16_t>("minHeatSetpointLimit", [value shortValue], 3000));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesAValueBackThatIsDifferentButValidForMinHeatSetpointLimitAttribute_33()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id minHeatSetpointLimitArgument;
        minHeatSetpointLimitArgument = [NSNumber numberWithShort:800];
        [cluster writeAttributeMinHeatSetpointLimitWithValue:minHeatSetpointLimitArgument
                                           completionHandler:^(NSError * _Nullable err) {
                                               NSLog(@"Writes a value back that is different but valid for MinHeatSetpointLimit "
                                                     @"attribute Error: %@",
                                                   err);

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

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsItBackAgainToConfirmTheSuccessfulWriteOfMinHeatSetpointLimitAttribute_34()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinHeatSetpointLimitWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads it back again to confirm the successful write of MinHeatSetpointLimit attribute Error: %@", err);

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

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("MinHeatSetpointLimit", actualValue, 800));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesAValueBackThatIsDifferentButViolatesTheDeadband_35()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id minHeatSetpointLimitArgument;
        minHeatSetpointLimitArgument = [NSNumber numberWithShort:2000];
        [cluster
            writeAttributeMinHeatSetpointLimitWithValue:minHeatSetpointLimitArgument
                                      completionHandler:^(NSError * _Nullable err) {
                                          NSLog(@"Writes a value back that is different but violates the deadband 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 TestWritesMinHeatSetpointLimitToValueBelowTheAbsMinHeatSetpointLimit_36()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id minHeatSetpointLimitArgument;
        minHeatSetpointLimitArgument = [NSNumber numberWithShort:650];
        [cluster
            writeAttributeMinHeatSetpointLimitWithValue:minHeatSetpointLimitArgument
                                      completionHandler:^(NSError * _Nullable err) {
                                          NSLog(
                                              @"Writes MinHeatSetpointLimit to value below the AbsMinHeatSetpointLimit  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 TestWritesMinHeatSetpointLimitToValueAboveTheAbsMaxHeatSetpointLimit_37()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id minHeatSetpointLimitArgument;
        minHeatSetpointLimitArgument = [NSNumber numberWithShort:4050];
        [cluster
            writeAttributeMinHeatSetpointLimitWithValue:minHeatSetpointLimitArgument
                                      completionHandler:^(NSError * _Nullable err) {
                                          NSLog(
                                              @"Writes MinHeatSetpointLimit to value above the AbsMaxHeatSetpointLimit  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 TestWritesTheLimitOfAbsMinHeatSetpointLimitToMinHeatSetpointLimitAttribute_38()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id minHeatSetpointLimitArgument;
        minHeatSetpointLimitArgument = [NSNumber numberWithShort:700];
        [cluster writeAttributeMinHeatSetpointLimitWithValue:minHeatSetpointLimitArgument
                                           completionHandler:^(NSError * _Nullable err) {
                                               NSLog(@"Writes the limit of AbsMinHeatSetpointLimit to MinHeatSetpointLimit "
                                                     @"attribute Error: %@",
                                                   err);

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

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesTheLimitOfAbsMaxHeatSetpointLimitToMinHeatSetpointLimitAttribute_39()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id minHeatSetpointLimitArgument;
        minHeatSetpointLimitArgument = [NSNumber numberWithShort:3000];
        [cluster writeAttributeMinHeatSetpointLimitWithValue:minHeatSetpointLimitArgument
                                           completionHandler:^(NSError * _Nullable err) {
                                               NSLog(@"Writes the limit of AbsMaxHeatSetpointLimit to MinHeatSetpointLimit "
                                                     @"attribute Error: %@",
                                                   err);

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

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsMaxHeatSetpointLimitAttributeFromServerDutAndVerifiesThatTheValueIsWithinRange_40()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxHeatSetpointLimitWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(
                @"Reads MaxHeatSetpointLimit attribute from Server DUT and verifies that the value is within range Error: %@", err);

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

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("MaxHeatSetpointLimit", actualValue, 3000));
            }

            VerifyOrReturn(CheckConstraintType("maxHeatSetpointLimit", "int16s", "int16s"));
            VerifyOrReturn(CheckConstraintMinValue<int16_t>("maxHeatSetpointLimit", [value shortValue], 700));
            VerifyOrReturn(CheckConstraintMaxValue<int16_t>("maxHeatSetpointLimit", [value shortValue], 3000));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesTheLimitOfAbsMinHeatSetpointLimitToMinHeatSetpointLimitAttribute_41()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id minHeatSetpointLimitArgument;
        minHeatSetpointLimitArgument = [NSNumber numberWithShort:700];
        [cluster writeAttributeMinHeatSetpointLimitWithValue:minHeatSetpointLimitArgument
                                           completionHandler:^(NSError * _Nullable err) {
                                               NSLog(@"Writes the limit of AbsMinHeatSetpointLimit to MinHeatSetpointLimit "
                                                     @"attribute Error: %@",
                                                   err);

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

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesTheLimitOfAbsMaxHeatSetpointLimitToMinHeatSetpointLimitAttribute_42()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id minHeatSetpointLimitArgument;
        minHeatSetpointLimitArgument = [NSNumber numberWithShort:3000];
        [cluster writeAttributeMinHeatSetpointLimitWithValue:minHeatSetpointLimitArgument
                                           completionHandler:^(NSError * _Nullable err) {
                                               NSLog(@"Writes the limit of AbsMaxHeatSetpointLimit to MinHeatSetpointLimit "
                                                     @"attribute Error: %@",
                                                   err);

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

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesAValueBackThatIsDifferentButValidForMaxHeatSetpointLimitAttribute_43()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id maxHeatSetpointLimitArgument;
        maxHeatSetpointLimitArgument = [NSNumber numberWithShort:2900];
        [cluster writeAttributeMaxHeatSetpointLimitWithValue:maxHeatSetpointLimitArgument
                                           completionHandler:^(NSError * _Nullable err) {
                                               NSLog(@"Writes a value back that is different but valid for MaxHeatSetpointLimit "
                                                     @"attribute Error: %@",
                                                   err);

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

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsItBackAgainToConfirmTheSuccessfulWriteOfMaxHeatSetpointLimitAttribute_44()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxHeatSetpointLimitWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads it back again to confirm the successful write of MaxHeatSetpointLimit attribute Error: %@", err);

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

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("MaxHeatSetpointLimit", actualValue, 2900));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesMaxHeatSetpointLimitToValueBelowTheAbsMinHeatSetpointLimit_45()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id maxHeatSetpointLimitArgument;
        maxHeatSetpointLimitArgument = [NSNumber numberWithShort:500];
        [cluster
            writeAttributeMaxHeatSetpointLimitWithValue:maxHeatSetpointLimitArgument
                                      completionHandler:^(NSError * _Nullable err) {
                                          NSLog(
                                              @"Writes MaxHeatSetpointLimit to value below the AbsMinHeatSetpointLimit  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 TestWritesMaxHeatSetpointLimitToValueAboveTheAbsMaxHeatSetpointLimit_46()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id maxHeatSetpointLimitArgument;
        maxHeatSetpointLimitArgument = [NSNumber numberWithShort:4000];
        [cluster
            writeAttributeMaxHeatSetpointLimitWithValue:maxHeatSetpointLimitArgument
                                      completionHandler:^(NSError * _Nullable err) {
                                          NSLog(
                                              @"Writes MaxHeatSetpointLimit to value above the AbsMaxHeatSetpointLimit  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 TestWritesTheLimitOfAbsMinHeatSetpointLimitToMaxHeatSetpointLimitAttribute_47()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id maxHeatSetpointLimitArgument;
        maxHeatSetpointLimitArgument = [NSNumber numberWithShort:700];
        [cluster writeAttributeMaxHeatSetpointLimitWithValue:maxHeatSetpointLimitArgument
                                           completionHandler:^(NSError * _Nullable err) {
                                               NSLog(@"Writes the limit of AbsMinHeatSetpointLimit to MaxHeatSetpointLimit "
                                                     @"attribute Error: %@",
                                                   err);

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

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesTheLimitOfAbsMaxHeatSetpointLimitToMaxHeatSetpointLimitAttribute_48()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id maxHeatSetpointLimitArgument;
        maxHeatSetpointLimitArgument = [NSNumber numberWithShort:3000];
        [cluster writeAttributeMaxHeatSetpointLimitWithValue:maxHeatSetpointLimitArgument
                                           completionHandler:^(NSError * _Nullable err) {
                                               NSLog(@"Writes the limit of AbsMaxHeatSetpointLimit to MaxHeatSetpointLimit "
                                                     @"attribute Error: %@",
                                                   err);

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

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsMinCoolSetpointLimitAttributeFromServerDutAndVerifiesThatTheValueIsWithinRange_49()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinCoolSetpointLimitWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(
                @"Reads MinCoolSetpointLimit attribute from Server DUT and verifies that the value is within range Error: %@", err);

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

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("MinCoolSetpointLimit", actualValue, 1600));
            }

            VerifyOrReturn(CheckConstraintType("minCoolSetpointLimit", "int16s", "int16s"));
            VerifyOrReturn(CheckConstraintMinValue<int16_t>("minCoolSetpointLimit", [value shortValue], 1600));
            VerifyOrReturn(CheckConstraintMaxValue<int16_t>("minCoolSetpointLimit", [value shortValue], 3200));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesAValueBackThatIsDifferentButValidForMinCoolSetpointLimitAttribute_50()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id minCoolSetpointLimitArgument;
        minCoolSetpointLimitArgument = [NSNumber numberWithShort:2000];
        [cluster writeAttributeMinCoolSetpointLimitWithValue:minCoolSetpointLimitArgument
                                           completionHandler:^(NSError * _Nullable err) {
                                               NSLog(@"Writes a value back that is different but valid for MinCoolSetpointLimit "
                                                     @"attribute Error: %@",
                                                   err);

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

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsItBackAgainToConfirmTheSuccessfulWriteOfMinCoolSetpointLimitAttribute_51()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinCoolSetpointLimitWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads it back again to confirm the successful write of MinCoolSetpointLimit attribute Error: %@", err);

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

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("MinCoolSetpointLimit", actualValue, 2000));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesMinCoolSetpointLimitToValueBelowTheAbsMinCoolSetpointLimit_52()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id minCoolSetpointLimitArgument;
        minCoolSetpointLimitArgument = [NSNumber numberWithShort:1000];
        [cluster
            writeAttributeMinCoolSetpointLimitWithValue:minCoolSetpointLimitArgument
                                      completionHandler:^(NSError * _Nullable err) {
                                          NSLog(
                                              @"Writes MinCoolSetpointLimit to value below the AbsMinCoolSetpointLimit  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 TestWritesMinCoolSetpointLimitToValueAboveTheMaxCoolSetpointLimit_53()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id minCoolSetpointLimitArgument;
        minCoolSetpointLimitArgument = [NSNumber numberWithShort:4000];
        [cluster
            writeAttributeMinCoolSetpointLimitWithValue:minCoolSetpointLimitArgument
                                      completionHandler:^(NSError * _Nullable err) {
                                          NSLog(@"Writes MinCoolSetpointLimit to value above the MaxCoolSetpointLimit  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 TestWritesTheLimitOfAbsMinCoolSetpointLimitToMinCoolSetpointLimitAttribute_54()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id minCoolSetpointLimitArgument;
        minCoolSetpointLimitArgument = [NSNumber numberWithShort:1600];
        [cluster writeAttributeMinCoolSetpointLimitWithValue:minCoolSetpointLimitArgument
                                           completionHandler:^(NSError * _Nullable err) {
                                               NSLog(@"Writes the limit of AbsMinCoolSetpointLimit to MinCoolSetpointLimit "
                                                     @"attribute Error: %@",
                                                   err);

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

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesTheLimitOfMaxCoolSetpointLimitToMinCoolSetpointLimitAttribute_55()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id minCoolSetpointLimitArgument;
        minCoolSetpointLimitArgument = [NSNumber numberWithShort:3200];
        [cluster writeAttributeMinCoolSetpointLimitWithValue:minCoolSetpointLimitArgument
                                           completionHandler:^(NSError * _Nullable err) {
                                               NSLog(@"Writes the limit of MaxCoolSetpointLimit to MinCoolSetpointLimit attribute "
                                                     @"Error: %@",
                                                   err);

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

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesTheLimitOfAbsMinCoolSetpointLimitToMinCoolSetpointLimitAttribute_56()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id minCoolSetpointLimitArgument;
        minCoolSetpointLimitArgument = [NSNumber numberWithShort:1600];
        [cluster writeAttributeMinCoolSetpointLimitWithValue:minCoolSetpointLimitArgument
                                           completionHandler:^(NSError * _Nullable err) {
                                               NSLog(@"Writes the limit of AbsMinCoolSetpointLimit to MinCoolSetpointLimit "
                                                     @"attribute Error: %@",
                                                   err);

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

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsMaxCoolSetpointLimitAttributeFromServerDutAndVerifiesThatTheValueIsWithinRange_57()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxCoolSetpointLimitWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(
                @"Reads MaxCoolSetpointLimit attribute from Server DUT and verifies that the value is within range Error: %@", err);

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

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("MaxCoolSetpointLimit", actualValue, 3200));
            }

            VerifyOrReturn(CheckConstraintType("maxCoolSetpointLimit", "int16s", "int16s"));
            VerifyOrReturn(CheckConstraintMinValue<int16_t>("maxCoolSetpointLimit", [value shortValue], 1600));
            VerifyOrReturn(CheckConstraintMaxValue<int16_t>("maxCoolSetpointLimit", [value shortValue], 3200));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesAValueBackThatIsDifferentButValidForMaxCoolSetpointLimitAttribute_58()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id maxCoolSetpointLimitArgument;
        maxCoolSetpointLimitArgument = [NSNumber numberWithShort:2000];
        [cluster writeAttributeMaxCoolSetpointLimitWithValue:maxCoolSetpointLimitArgument
                                           completionHandler:^(NSError * _Nullable err) {
                                               NSLog(@"Writes a value back that is different but valid for MaxCoolSetpointLimit "
                                                     @"attribute Error: %@",
                                                   err);

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

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsItBackAgainToConfirmTheSuccessfulWriteOfMaxCoolSetpointLimitAttribute_59()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxCoolSetpointLimitWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads it back again to confirm the successful write of MaxCoolSetpointLimit attribute Error: %@", err);

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

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("MaxCoolSetpointLimit", actualValue, 2000));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesMaxCoolSetpointLimitToValueBelowTheAbsMinCoolSetpointLimit_60()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id maxCoolSetpointLimitArgument;
        maxCoolSetpointLimitArgument = [NSNumber numberWithShort:1000];
        [cluster
            writeAttributeMaxCoolSetpointLimitWithValue:maxCoolSetpointLimitArgument
                                      completionHandler:^(NSError * _Nullable err) {
                                          NSLog(
                                              @"Writes MaxCoolSetpointLimit to value below the AbsMinCoolSetpointLimit  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 TestWritesMaxCoolSetpointLimitToValueAboveTheMaxCoolSetpointLimit_61()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id maxCoolSetpointLimitArgument;
        maxCoolSetpointLimitArgument = [NSNumber numberWithShort:4000];
        [cluster
            writeAttributeMaxCoolSetpointLimitWithValue:maxCoolSetpointLimitArgument
                                      completionHandler:^(NSError * _Nullable err) {
                                          NSLog(@"Writes MaxCoolSetpointLimit to value above the MaxCoolSetpointLimit  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 TestWritesTheLimitOfAbsMinCoolSetpointLimitToMaxCoolSetpointLimitAttribute_62()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id maxCoolSetpointLimitArgument;
        maxCoolSetpointLimitArgument = [NSNumber numberWithShort:1600];
        [cluster writeAttributeMaxCoolSetpointLimitWithValue:maxCoolSetpointLimitArgument
                                           completionHandler:^(NSError * _Nullable err) {
                                               NSLog(@"Writes the limit of AbsMinCoolSetpointLimit to MaxCoolSetpointLimit "
                                                     @"attribute Error: %@",
                                                   err);

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

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesTheLimitOfMaxCoolSetpointLimitToMaxCoolSetpointLimitAttribute_63()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id maxCoolSetpointLimitArgument;
        maxCoolSetpointLimitArgument = [NSNumber numberWithShort:3200];
        [cluster writeAttributeMaxCoolSetpointLimitWithValue:maxCoolSetpointLimitArgument
                                           completionHandler:^(NSError * _Nullable err) {
                                               NSLog(@"Writes the limit of MaxCoolSetpointLimit to MaxCoolSetpointLimit attribute "
                                                     @"Error: %@",
                                                   err);

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

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesSetsBackDefaultValueOfMinHeatSetpointLimit_64()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id minHeatSetpointLimitArgument;
        minHeatSetpointLimitArgument = [NSNumber numberWithShort:700];
        [cluster writeAttributeMinHeatSetpointLimitWithValue:minHeatSetpointLimitArgument
                                           completionHandler:^(NSError * _Nullable err) {
                                               NSLog(@"Writes (sets back) default value of MinHeatSetpointLimit Error: %@", err);

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

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesSetsBackdefaultValueOfMaxHeatSetpointLimit_65()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id maxHeatSetpointLimitArgument;
        maxHeatSetpointLimitArgument = [NSNumber numberWithShort:3000];
        [cluster writeAttributeMaxHeatSetpointLimitWithValue:maxHeatSetpointLimitArgument
                                           completionHandler:^(NSError * _Nullable err) {
                                               NSLog(@"Writes (sets back)default value of MaxHeatSetpointLimit Error: %@", err);

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

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesMaxHeatSetpointLimitThatMeetsTheDeadbandOf25c_66()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id maxHeatSetpointLimitArgument;
        maxHeatSetpointLimitArgument = [NSNumber numberWithShort:2950];
        [cluster writeAttributeMaxHeatSetpointLimitWithValue:maxHeatSetpointLimitArgument
                                           completionHandler:^(NSError * _Nullable err) {
                                               NSLog(@"Writes MaxHeatSetpointLimit That meets the deadband of 2.5C Error: %@", err);

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

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesSetsBackDefaultValueOfMinCoolSetpointLimit_67()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id minCoolSetpointLimitArgument;
        minCoolSetpointLimitArgument = [NSNumber numberWithShort:1600];
        [cluster writeAttributeMinCoolSetpointLimitWithValue:minCoolSetpointLimitArgument
                                           completionHandler:^(NSError * _Nullable err) {
                                               NSLog(@"Writes (sets back) default value of MinCoolSetpointLimit Error: %@", err);

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

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesSetsBackDefaultValueOfMaxCoolSetpointLimit_68()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id maxCoolSetpointLimitArgument;
        maxCoolSetpointLimitArgument = [NSNumber numberWithShort:3200];
        [cluster writeAttributeMaxCoolSetpointLimitWithValue:maxCoolSetpointLimitArgument
                                           completionHandler:^(NSError * _Nullable err) {
                                               NSLog(@"Writes (sets back) default value of MaxCoolSetpointLimit Error: %@", err);

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

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsMinSetpointDeadBandAttributeFromServerDutAndVerifiesThatTheValueIsWithinRange_69()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinSetpointDeadBandWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(
                @"Reads MinSetpointDeadBand attribute from Server DUT and verifies that the value is within range Error: %@", err);

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

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("MinSetpointDeadBand", actualValue, 25));
            }

            VerifyOrReturn(CheckConstraintType("minSetpointDeadBand", "int8s", "int8s"));
            VerifyOrReturn(CheckConstraintMinValue<int8_t>("minSetpointDeadBand", [value charValue], 0));
            VerifyOrReturn(CheckConstraintMaxValue<int8_t>("minSetpointDeadBand", [value charValue], 25));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesAValueBackThatIsDifferentButValidForMinSetpointDeadBandAttribute_70()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id minSetpointDeadBandArgument;
        minSetpointDeadBandArgument = [NSNumber numberWithChar:5];
        [cluster writeAttributeMinSetpointDeadBandWithValue:minSetpointDeadBandArgument
                                          completionHandler:^(NSError * _Nullable err) {
                                              NSLog(@"Writes a value back that is different but valid for MinSetpointDeadBand "
                                                    @"attribute Error: %@",
                                                  err);

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

                                              NextTest();
                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsItBackAgainToConfirmTheSuccessfulWriteOfMinSetpointDeadBandAttribute_71()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinSetpointDeadBandWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads it back again to confirm the successful write of MinSetpointDeadBand attribute Error: %@", err);

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

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesTheValueBelowMinSetpointDeadBand_72()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id minSetpointDeadBandArgument;
        minSetpointDeadBandArgument = [NSNumber numberWithChar:-1];
        [cluster writeAttributeMinSetpointDeadBandWithValue:minSetpointDeadBandArgument
                                          completionHandler:^(NSError * _Nullable err) {
                                              NSLog(@"Writes the value below MinSetpointDeadBand 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 TestWritesTheValueAboveMinSetpointDeadBand_73()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id minSetpointDeadBandArgument;
        minSetpointDeadBandArgument = [NSNumber numberWithChar:30];
        [cluster writeAttributeMinSetpointDeadBandWithValue:minSetpointDeadBandArgument
                                          completionHandler:^(NSError * _Nullable err) {
                                              NSLog(@"Writes the value above MinSetpointDeadBand  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 TestWritesTheMinLimitOfMinSetpointDeadBand_74()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id minSetpointDeadBandArgument;
        minSetpointDeadBandArgument = [NSNumber numberWithChar:0];
        [cluster writeAttributeMinSetpointDeadBandWithValue:minSetpointDeadBandArgument
                                          completionHandler:^(NSError * _Nullable err) {
                                              NSLog(@"Writes the min limit of MinSetpointDeadBand Error: %@", err);

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

                                              NextTest();
                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesTheMaxLimitOfMinSetpointDeadBand_75()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id minSetpointDeadBandArgument;
        minSetpointDeadBandArgument = [NSNumber numberWithChar:25];
        [cluster writeAttributeMinSetpointDeadBandWithValue:minSetpointDeadBandArgument
                                          completionHandler:^(NSError * _Nullable err) {
                                              NSLog(@"Writes the max limit of MinSetpointDeadBand Error: %@", err);

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

                                              NextTest();
                                          }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsControlSequenceOfOperationFromServerDutAndVerifiesThatTheValueIsValid_76()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeControlSequenceOfOperationWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"Reads ControlSequenceOfOperation from Server DUT and verifies that the value is valid Error: %@", err);

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

                {
                    id actualValue = value;
                    VerifyOrReturn(CheckValue("ControlSequenceOfOperation", actualValue, 4U));
                }

                VerifyOrReturn(CheckConstraintType("controlSequenceOfOperation", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue<uint8_t>("controlSequenceOfOperation", [value unsignedCharValue], 0U));
                VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("controlSequenceOfOperation", [value unsignedCharValue], 5U));

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeCommandForControlSequenceOfOperationWithANewValidValue_77()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id controlSequenceOfOperationArgument;
        controlSequenceOfOperationArgument = [NSNumber numberWithUnsignedChar:2U];
        [cluster writeAttributeControlSequenceOfOperationWithValue:controlSequenceOfOperationArgument
                                                 completionHandler:^(NSError * _Nullable err) {
                                                     NSLog(@"Write Attribute command for ControlSequenceOfOperation with a new "
                                                           @"valid value Error: %@",
                                                         err);

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

                                                     NextTest();
                                                 }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadItBackAgainToConfirmTheSuccessfulWrite_78()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeControlSequenceOfOperationWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
                NSLog(@"Read it back again to confirm the successful write Error: %@", err);

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

                {
                    id actualValue = value;
                    VerifyOrReturn(CheckValue("ControlSequenceOfOperation", actualValue, 2U));
                }

                NextTest();
            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWritesMaxHeatSetpointLimitAttributeToDefaultValueOf2950ToMeetDeadbandConstraint_79()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id maxHeatSetpointLimitArgument;
        maxHeatSetpointLimitArgument = [NSNumber numberWithShort:2950];
        [cluster writeAttributeMaxHeatSetpointLimitWithValue:maxHeatSetpointLimitArgument
                                           completionHandler:^(NSError * _Nullable err) {
                                               NSLog(@"Writes MaxHeatSetpointLimit attribute to default value of 2950 to meet "
                                                     @"deadband constraint Error: %@",
                                                   err);

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

                                               NextTest();
                                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSetsOccupiedCoolingSetpointToDefaultValue_80()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id occupiedCoolingSetpointArgument;
        occupiedCoolingSetpointArgument = [NSNumber numberWithShort:2600];
        [cluster writeAttributeOccupiedCoolingSetpointWithValue:occupiedCoolingSetpointArgument
                                              completionHandler:^(NSError * _Nullable err) {
                                                  NSLog(@"Sets OccupiedCoolingSetpoint to default value Error: %@", err);

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

                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSetsOccupiedHeatingSetpointToDefaultValue_81()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id occupiedHeatingSetpointArgument;
        occupiedHeatingSetpointArgument = [NSNumber numberWithShort:2000];
        [cluster writeAttributeOccupiedHeatingSetpointWithValue:occupiedHeatingSetpointArgument
                                              completionHandler:^(NSError * _Nullable err) {
                                                  NSLog(@"Sets OccupiedHeatingSetpoint to default value Error: %@", err);

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

                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendsSetpointRaiseCommandHeatOnly_82()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRThermostatClusterSetpointRaiseLowerParams alloc] init];
        params.mode = [NSNumber numberWithUnsignedChar:0U];
        params.amount = [NSNumber numberWithChar:-30];
        [cluster setpointRaiseLowerWithParams:params
                            completionHandler:^(NSError * _Nullable err) {
                                NSLog(@"Sends SetpointRaise Command Heat Only Error: %@", err);

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

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsBackOccupiedHeatingSetpointToConfirmTheSuccessOfTheWrite_83()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOccupiedHeatingSetpointWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads back OccupiedHeatingSetpoint to confirm the success of the write Error: %@", err);

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

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OccupiedHeatingSetpoint", actualValue, 1700));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSetsOccupiedHeatingSetpointToDefaultValue_84()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id occupiedHeatingSetpointArgument;
        occupiedHeatingSetpointArgument = [NSNumber numberWithShort:2000];
        [cluster writeAttributeOccupiedHeatingSetpointWithValue:occupiedHeatingSetpointArgument
                                              completionHandler:^(NSError * _Nullable err) {
                                                  NSLog(@"Sets OccupiedHeatingSetpoint to default value Error: %@", err);

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

                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendsSetpointRaiseCommandHeatOnly_85()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRThermostatClusterSetpointRaiseLowerParams alloc] init];
        params.mode = [NSNumber numberWithUnsignedChar:0U];
        params.amount = [NSNumber numberWithChar:30];
        [cluster setpointRaiseLowerWithParams:params
                            completionHandler:^(NSError * _Nullable err) {
                                NSLog(@"Sends SetpointRaise Command Heat Only Error: %@", err);

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

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsBackOccupiedHeatingSetpointToConfirmTheSuccessOfTheWrite_86()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOccupiedHeatingSetpointWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads back OccupiedHeatingSetpoint to confirm the success of the write Error: %@", err);

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

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OccupiedHeatingSetpoint", actualValue, 2300));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendsSetpointRaiseCommandCoolOnly_87()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRThermostatClusterSetpointRaiseLowerParams alloc] init];
        params.mode = [NSNumber numberWithUnsignedChar:1U];
        params.amount = [NSNumber numberWithChar:-30];
        [cluster setpointRaiseLowerWithParams:params
                            completionHandler:^(NSError * _Nullable err) {
                                NSLog(@"Sends SetpointRaise Command Cool Only Error: %@", err);

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

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsBackOccupiedCoolingSetpointToConfirmTheSuccessOfTheWrite_88()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOccupiedCoolingSetpointWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads back OccupiedCoolingSetpoint to confirm the success of the write Error: %@", err);

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

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OccupiedCoolingSetpoint", actualValue, 2300));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSetsOccupiedCoolingSetpointToDefaultValue_89()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id occupiedCoolingSetpointArgument;
        occupiedCoolingSetpointArgument = [NSNumber numberWithShort:2600];
        [cluster writeAttributeOccupiedCoolingSetpointWithValue:occupiedCoolingSetpointArgument
                                              completionHandler:^(NSError * _Nullable err) {
                                                  NSLog(@"Sets OccupiedCoolingSetpoint to default value Error: %@", err);

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

                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendsSetpointRaiseCommandCoolOnly_90()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRThermostatClusterSetpointRaiseLowerParams alloc] init];
        params.mode = [NSNumber numberWithUnsignedChar:1U];
        params.amount = [NSNumber numberWithChar:30];
        [cluster setpointRaiseLowerWithParams:params
                            completionHandler:^(NSError * _Nullable err) {
                                NSLog(@"Sends SetpointRaise Command Cool Only Error: %@", err);

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

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsBackOccupiedCoolingSetpointToConfirmTheSuccessOfTheWrite_91()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOccupiedCoolingSetpointWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads back OccupiedCoolingSetpoint to confirm the success of the write Error: %@", err);

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

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OccupiedCoolingSetpoint", actualValue, 2900));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSetsOccupiedCoolingSetpointToDefaultValue_92()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id occupiedCoolingSetpointArgument;
        occupiedCoolingSetpointArgument = [NSNumber numberWithShort:2600];
        [cluster writeAttributeOccupiedCoolingSetpointWithValue:occupiedCoolingSetpointArgument
                                              completionHandler:^(NSError * _Nullable err) {
                                                  NSLog(@"Sets OccupiedCoolingSetpoint to default value Error: %@", err);

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

                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSetsOccupiedHeatingSetpointToDefaultValue_93()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id occupiedHeatingSetpointArgument;
        occupiedHeatingSetpointArgument = [NSNumber numberWithShort:2000];
        [cluster writeAttributeOccupiedHeatingSetpointWithValue:occupiedHeatingSetpointArgument
                                              completionHandler:^(NSError * _Nullable err) {
                                                  NSLog(@"Sets OccupiedHeatingSetpoint to default value Error: %@", err);

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

                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendsSetpointRaiseCommandHeatCool_94()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRThermostatClusterSetpointRaiseLowerParams alloc] init];
        params.mode = [NSNumber numberWithUnsignedChar:2U];
        params.amount = [NSNumber numberWithChar:-30];
        [cluster setpointRaiseLowerWithParams:params
                            completionHandler:^(NSError * _Nullable err) {
                                NSLog(@"Sends SetpointRaise Command Heat & Cool Error: %@", err);

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

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsBackOccupiedCoolingSetpointToConfirmTheSuccessOfTheWrite_95()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOccupiedCoolingSetpointWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads back OccupiedCoolingSetpoint to confirm the success of the write Error: %@", err);

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

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OccupiedCoolingSetpoint", actualValue, 2300));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsBackOccupiedHeatingSetpointToConfirmTheSuccessOfTheWrite_96()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOccupiedHeatingSetpointWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads back OccupiedHeatingSetpoint to confirm the success of the write Error: %@", err);

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

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OccupiedHeatingSetpoint", actualValue, 1700));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSetsOccupiedCoolingSetpointToDefaultValue_97()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id occupiedCoolingSetpointArgument;
        occupiedCoolingSetpointArgument = [NSNumber numberWithShort:2600];
        [cluster writeAttributeOccupiedCoolingSetpointWithValue:occupiedCoolingSetpointArgument
                                              completionHandler:^(NSError * _Nullable err) {
                                                  NSLog(@"Sets OccupiedCoolingSetpoint to default value Error: %@", err);

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

                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSetsOccupiedHeatingSetpointToDefaultValue_98()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id occupiedHeatingSetpointArgument;
        occupiedHeatingSetpointArgument = [NSNumber numberWithShort:2000];
        [cluster writeAttributeOccupiedHeatingSetpointWithValue:occupiedHeatingSetpointArgument
                                              completionHandler:^(NSError * _Nullable err) {
                                                  NSLog(@"Sets OccupiedHeatingSetpoint to default value Error: %@", err);

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

                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendsSetpointRaiseCommandHeatCool_99()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRThermostatClusterSetpointRaiseLowerParams alloc] init];
        params.mode = [NSNumber numberWithUnsignedChar:2U];
        params.amount = [NSNumber numberWithChar:30];
        [cluster setpointRaiseLowerWithParams:params
                            completionHandler:^(NSError * _Nullable err) {
                                NSLog(@"Sends SetpointRaise Command Heat & Cool Error: %@", err);

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

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsBackOccupiedCoolingSetpointToConfirmTheSuccessOfTheWrite_100()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOccupiedCoolingSetpointWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads back OccupiedCoolingSetpoint to confirm the success of the write Error: %@", err);

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

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OccupiedCoolingSetpoint", actualValue, 2900));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsBackOccupiedHeatingSetpointToConfirmTheSuccessOfTheWrite_101()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOccupiedHeatingSetpointWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads back OccupiedHeatingSetpoint to confirm the success of the write Error: %@", err);

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

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("OccupiedHeatingSetpoint", actualValue, 2300));
            }

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

        [cluster readAttributeClusterRevisionWithCompletionHandler:^(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");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletionHandler:^(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");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletionHandler:^(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");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTemperatureDisplayModeWithCompletionHandler:^(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");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeKeypadLockoutWithCompletionHandler:^(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");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeScheduleProgrammingVisibilityWithCompletionHandler:^(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");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id temperatureDisplayModeArgument;
        temperatureDisplayModeArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster
            writeAttributeTemperatureDisplayModeWithValue:temperatureDisplayModeArgument
                                        completionHandler:^(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");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTemperatureDisplayModeWithCompletionHandler:^(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");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id temperatureDisplayModeArgument;
        temperatureDisplayModeArgument = [NSNumber numberWithUnsignedChar:1U];
        [cluster
            writeAttributeTemperatureDisplayModeWithValue:temperatureDisplayModeArgument
                                        completionHandler:^(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");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTemperatureDisplayModeWithCompletionHandler:^(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");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id temperatureDisplayModeArgument;
        temperatureDisplayModeArgument = [NSNumber numberWithUnsignedChar:2U];
        [cluster writeAttributeTemperatureDisplayModeWithValue:temperatureDisplayModeArgument
                                             completionHandler:^(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");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTemperatureDisplayModeWithCompletionHandler:^(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");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id keypadLockoutArgument;
        keypadLockoutArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeKeypadLockoutWithValue:keypadLockoutArgument
                                    completionHandler:^(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");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeKeypadLockoutWithCompletionHandler:^(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");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id keypadLockoutArgument;
        keypadLockoutArgument = [NSNumber numberWithUnsignedChar:1U];
        [cluster writeAttributeKeypadLockoutWithValue:keypadLockoutArgument
                                    completionHandler:^(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");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeKeypadLockoutWithCompletionHandler:^(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");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id keypadLockoutArgument;
        keypadLockoutArgument = [NSNumber numberWithUnsignedChar:2U];
        [cluster writeAttributeKeypadLockoutWithValue:keypadLockoutArgument
                                    completionHandler:^(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");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeKeypadLockoutWithCompletionHandler:^(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");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id keypadLockoutArgument;
        keypadLockoutArgument = [NSNumber numberWithUnsignedChar:3U];
        [cluster writeAttributeKeypadLockoutWithValue:keypadLockoutArgument
                                    completionHandler:^(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");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeKeypadLockoutWithCompletionHandler:^(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");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id keypadLockoutArgument;
        keypadLockoutArgument = [NSNumber numberWithUnsignedChar:4U];
        [cluster writeAttributeKeypadLockoutWithValue:keypadLockoutArgument
                                    completionHandler:^(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");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeKeypadLockoutWithCompletionHandler:^(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");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id keypadLockoutArgument;
        keypadLockoutArgument = [NSNumber numberWithUnsignedChar:5U];
        [cluster writeAttributeKeypadLockoutWithValue:keypadLockoutArgument
                                    completionHandler:^(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");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeKeypadLockoutWithCompletionHandler:^(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");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id keypadLockoutArgument;
        keypadLockoutArgument = [NSNumber numberWithUnsignedChar:6U];
        [cluster
            writeAttributeKeypadLockoutWithValue:keypadLockoutArgument
                               completionHandler:^(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");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeKeypadLockoutWithCompletionHandler:^(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");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id scheduleProgrammingVisibilityArgument;
        scheduleProgrammingVisibilityArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeScheduleProgrammingVisibilityWithValue:scheduleProgrammingVisibilityArgument
                                                    completionHandler:^(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");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeScheduleProgrammingVisibilityWithCompletionHandler:^(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");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id scheduleProgrammingVisibilityArgument;
        scheduleProgrammingVisibilityArgument = [NSNumber numberWithUnsignedChar:1U];
        [cluster writeAttributeScheduleProgrammingVisibilityWithValue:scheduleProgrammingVisibilityArgument
                                                    completionHandler:^(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");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeScheduleProgrammingVisibilityWithCompletionHandler:^(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");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id scheduleProgrammingVisibilityArgument;
        scheduleProgrammingVisibilityArgument = [NSNumber numberWithUnsignedChar:2U];
        [cluster writeAttributeScheduleProgrammingVisibilityWithValue:scheduleProgrammingVisibilityArgument
                                                    completionHandler:^(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");
        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeScheduleProgrammingVisibilityWithCompletionHandler:^(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_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");
        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletionHandler:^(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");
        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletionHandler:^(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");
        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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");
        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletionHandler:^(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_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");
        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpoint: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
                                completionHandler:^(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");
        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLabelListWithCompletionHandler:^(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");
        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpoint: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
                                completionHandler:^(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");
        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpoint: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
                                completionHandler:^(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");
        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpoint: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
                                completionHandler:^(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");
        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLabelListWithCompletionHandler:^(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");
        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpoint: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
                                completionHandler:^(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");
        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLabelListWithCompletionHandler:^(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_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");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBssidWithCompletionHandler:^(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");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSecurityTypeWithCompletionHandler:^(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");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeWiFiVersionWithCompletionHandler:^(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");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeChannelNumberWithCompletionHandler:^(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");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRssiWithCompletionHandler:^(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");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBeaconLostCountWithCompletionHandler:^(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");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBeaconRxCountWithCompletionHandler:^(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");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePacketMulticastRxCountWithCompletionHandler:^(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");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePacketMulticastTxCountWithCompletionHandler:^(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");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePacketUnicastRxCountWithCompletionHandler:^(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");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePacketUnicastTxCountWithCompletionHandler:^(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");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentMaxRateWithCompletionHandler:^(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");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOverrunCountWithCompletionHandler:^(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")) {
                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")) {
                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")) {
                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")) {
                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")) {
                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")) {
                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");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster resetCountsWithCompletionHandler:^(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");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBeaconLostCountWithCompletionHandler:^(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");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBeaconRxCountWithCompletionHandler:^(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");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePacketMulticastRxCountWithCompletionHandler:^(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");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePacketMulticastTxCountWithCompletionHandler:^(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");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePacketUnicastRxCountWithCompletionHandler:^(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");
        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePacketUnicastTxCountWithCompletionHandler:^(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")) {
                NextTest();
                return;
            }
            err = TestThReadsFromTheDutThe0xFFFCFeatureMapAttribute_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : TH reads from the DUT the (0xFFFB) AttributeList attribute\n");
            if (ShouldSkip("WNCV.S.Afffb")) {
                NextTest();
                return;
            }
            err = TestThReadsFromTheDutThe0xFFFBAttributeListAttribute_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH reads optional attribute(SafetyStatus) in AttributeList\n");
            if (ShouldSkip("WNCV.S.Afffb && WNCV.S.A001a")) {
                NextTest();
                return;
            }
            err = TestThReadsOptionalAttributeSafetyStatusInAttributeList_4();
            break;
        case 5:
            ChipLogProgress(chipTool,
                " ***** Test Step 5 : 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_5();
            break;
        case 6:
            ChipLogProgress(
                chipTool, " ***** Test Step 6 : 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_6();
            break;
        case 7:
            ChipLogProgress(chipTool,
                " ***** Test Step 7 : 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_7();
            break;
        case 8:
            ChipLogProgress(
                chipTool, " ***** Test Step 8 : 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_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH reads from the DUT the (0xFFF9) AcceptedCommandList attribute\n");
            if (ShouldSkip("WNCV.S.Afff9")) {
                NextTest();
                return;
            }
            err = TestThReadsFromTheDutThe0xFFF9AcceptedCommandListAttribute_9();
            break;
        case 10:
            ChipLogProgress(chipTool,
                " ***** Test Step 10 : 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_10();
            break;
        case 11:
            ChipLogProgress(chipTool,
                " ***** Test Step 11 : 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_11();
            break;
        case 12:
            ChipLogProgress(chipTool,
                " ***** Test Step 12 : 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_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : TH reads from the DUT the (0xFFF8) GeneratedCommandList attribute\n");
            if (ShouldSkip("WNCV.S.Afff8")) {
                NextTest();
                return;
            }
            err = TestThReadsFromTheDutThe0xFFF8GeneratedCommandListAttribute_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 TestThReadsFromTheDutThe0xFFFDClusterRevisionAttribute_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterRevisionWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFeatureMapWithCompletionHandler:^(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));

            VerifyOrReturn(CheckConstraintType("featureMap", "bitmap32", "bitmap32"));
            VerifyOrReturn(CheckConstraintMinValue<uint32_t>("featureMap", [value unsignedIntValue], 0UL));
            VerifyOrReturn(CheckConstraintMaxValue<uint32_t>("featureMap", [value unsignedIntValue], 32768UL));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsFromTheDutThe0xFFFBAttributeListAttribute_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTypeWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeConfigStatusWithCompletionHandler:^(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], 63U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1cReadTheRoMandatoryAttributeDefaultOperationalStatus_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletionHandler:^(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], 63U));

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test1dReadTheRoMandatoryAttributeDefaultEndProductType_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEndProductTypeWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeModeWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id modeArgument;
        modeArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeModeWithValue:modeArgument
                           completionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionLiftPercent100thsWithCompletionHandler:^(
            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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionTiltPercent100thsWithCompletionHandler:^(
            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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionLiftPercent100thsWithCompletionHandler:^(
            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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionTiltPercent100thsWithCompletionHandler:^(
            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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInstalledOpenLimitLiftWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInstalledClosedLimitLiftWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInstalledOpenLimitTiltWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInstalledClosedLimitTiltWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSafetyStatusWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePhysicalClosedLimitLiftWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePhysicalClosedLimitTiltWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionLiftWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionTiltWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNumberOfActuationsLiftWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNumberOfActuationsTiltWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionLiftPercentageWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionTiltPercentageWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id modeArgument;
        modeArgument = [NSNumber numberWithUnsignedChar:1U];
        [cluster writeAttributeModeWithValue:modeArgument
                           completionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeConfigStatusWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id modeArgument;
        modeArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeModeWithValue:modeArgument
                           completionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeConfigStatusWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id modeArgument;
        modeArgument = [NSNumber numberWithUnsignedChar:2U];
        [cluster writeAttributeModeWithValue:modeArgument
                           completionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeConfigStatusWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster downOrCloseWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id modeArgument;
        modeArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeModeWithValue:modeArgument
                           completionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeConfigStatusWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeModeWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster downOrCloseWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id modeArgument;
        modeArgument = [NSNumber numberWithUnsignedChar:4U];
        [cluster writeAttributeModeWithValue:modeArgument
                           completionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster downOrCloseWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeConfigStatusWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id modeArgument;
        modeArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeModeWithValue:modeArgument
                           completionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster downOrCloseWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeConfigStatusWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEndProductTypeWithCompletionHandler:^(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 : 3a1: Verify DUT reports OperationalStatus attribute to TH after a UpOrOpen\n");
            if (ShouldSkip("WNCV.S.A000a")) {
                NextTest();
                return;
            }
            err = Test3a1VerifyDutReportsOperationalStatusAttributeToThAfterAUpOrOpen_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : 3a2: DUT updates its attributes\n");
            err = Test3a2DutUpdatesItsAttributes_15();
            break;
        case 16:
            ChipLogProgress(
                chipTool, " ***** Test Step 16 : 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_16();
            break;
        case 17:
            ChipLogProgress(chipTool,
                " ***** Test Step 17 : 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_17();
            break;
        case 18:
            ChipLogProgress(
                chipTool, " ***** Test Step 18 : 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_18();
            break;
        case 19:
            ChipLogProgress(chipTool,
                " ***** Test Step 19 : 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_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : 4a: TH sends a StopMotion command to DUT\n");
            if (ShouldSkip("WNCV.S.C02.Rsp")) {
                NextTest();
                return;
            }
            err = Test4aThSendsAStopMotionCommandToDut_20();
            break;
        case 21:
            ChipLogProgress(
                chipTool, " ***** Test Step 21 : 4b: TH waits for 3 seconds the end of inertial movement(s) on the device\n");
            err = Test4bThWaitsFor3SecondsTheEndOfInertialMovementsOnTheDevice_21();
            break;
        case 22:
            ChipLogProgress(
                chipTool, " ***** Test Step 22 : 4c: Verify DUT update OperationalStatus attribute to TH after a StopMotion\n");
            if (ShouldSkip("WNCV.S.A000a")) {
                NextTest();
                return;
            }
            err = Test4cVerifyDutUpdateOperationalStatusAttributeToThAfterAStopMotion_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : 5a: TH waits for x seconds attributes update on the device\n");
            err = Test5aThWaitsForXSecondsAttributesUpdateOnTheDevice_23();
            break;
        case 24:
            ChipLogProgress(
                chipTool, " ***** Test Step 24 : 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_24();
            break;
        case 25:
            ChipLogProgress(
                chipTool, " ***** Test Step 25 : 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_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 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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster downOrCloseWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionLiftPercent100thsWithCompletionHandler:^(
            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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionLiftPercentageWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionTiltPercent100thsWithCompletionHandler:^(
            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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionTiltPercentageWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint: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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        uint16_t minIntervalArgument = 4U;
        uint16_t maxIntervalArgument = 5U;
        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] init];
        [cluster subscribeAttributeOperationalStatusWithMinInterval:[NSNumber numberWithUnsignedInt:minIntervalArgument]
            maxInterval:[NSNumber numberWithUnsignedInt:maxIntervalArgument]
            params: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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster upOrOpenWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionLiftPercent100thsWithCompletionHandler:^(
            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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionTiltPercent100thsWithCompletionHandler:^(
            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 Test3a1VerifyDutReportsOperationalStatusAttributeToThAfterAUpOrOpen_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint: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(@"3a1: Verify DUT reports OperationalStatus attribute to TH after a UpOrOpen Error: %@", err);

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

            VerifyOrReturn(CheckConstraintType("operationalStatus", "bitmap8", "bitmap8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("operationalStatus", [value unsignedCharValue], 5U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("operationalStatus", [value unsignedCharValue], 21U));

            NextTest();
        };

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3a2DutUpdatesItsAttributes_15()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 2000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test3bIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionLiftPercent100thsWithCompletionHandler:^(
            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_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionLiftPercentageWithCompletionHandler:^(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_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionTiltPercent100thsWithCompletionHandler:^(
            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_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionTiltPercentageWithCompletionHandler:^(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_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster stopMotionWithCompletionHandler:^(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_21()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 3000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test4cVerifyDutUpdateOperationalStatusAttributeToThAfterAStopMotion_22()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletionHandler:^(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_23()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 1000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test5bIfPaLfThReadsTargetPositionLiftPercent100thsAttributeFromDut_24()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionLiftPercent100thsWithCompletionHandler:^(
            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_25()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionTiltPercent100thsWithCompletionHandler:^(
            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: Verify DUT reports OperationalStatus attribute to TH after a DownOrClose\n");
            if (ShouldSkip("WNCV.S.A000a")) {
                NextTest();
                return;
            }
            err = Test3aVerifyDutReportsOperationalStatusAttributeToThAfterADownOrClose_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : 3a2: DUT updates its attributes\n");
            err = Test3a2DutUpdatesItsAttributes_15();
            break;
        case 16:
            ChipLogProgress(
                chipTool, " ***** Test Step 16 : 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_16();
            break;
        case 17:
            ChipLogProgress(chipTool,
                " ***** Test Step 17 : 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_17();
            break;
        case 18:
            ChipLogProgress(
                chipTool, " ***** Test Step 18 : 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_18();
            break;
        case 19:
            ChipLogProgress(chipTool,
                " ***** Test Step 19 : 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_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : 4a: TH sends a StopMotion command to DUT\n");
            if (ShouldSkip("WNCV.S.C02.Rsp")) {
                NextTest();
                return;
            }
            err = Test4aThSendsAStopMotionCommandToDut_20();
            break;
        case 21:
            ChipLogProgress(
                chipTool, " ***** Test Step 21 : 4b: TH waits for 3 seconds the end of inertial movement(s) on the device\n");
            err = Test4bThWaitsFor3SecondsTheEndOfInertialMovementsOnTheDevice_21();
            break;
        case 22:
            ChipLogProgress(
                chipTool, " ***** Test Step 22 : 4c: Verify DUT update OperationalStatus attribute to TH after a StopMotion\n");
            if (ShouldSkip("WNCV.S.A000a")) {
                NextTest();
                return;
            }
            err = Test4cVerifyDutUpdateOperationalStatusAttributeToThAfterAStopMotion_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : 5a: TH waits for x seconds attributes update on the device\n");
            err = Test5aThWaitsForXSecondsAttributesUpdateOnTheDevice_23();
            break;
        case 24:
            ChipLogProgress(
                chipTool, " ***** Test Step 24 : 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_24();
            break;
        case 25:
            ChipLogProgress(
                chipTool, " ***** Test Step 25 : 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_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 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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster upOrOpenWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionLiftPercent100thsWithCompletionHandler:^(
            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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionLiftPercentageWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionTiltPercent100thsWithCompletionHandler:^(
            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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionTiltPercentageWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint: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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        uint16_t minIntervalArgument = 4U;
        uint16_t maxIntervalArgument = 5U;
        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] init];
        [cluster subscribeAttributeOperationalStatusWithMinInterval:[NSNumber numberWithUnsignedInt:minIntervalArgument]
            maxInterval:[NSNumber numberWithUnsignedInt:maxIntervalArgument]
            params: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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster downOrCloseWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionLiftPercent100thsWithCompletionHandler:^(
            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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionTiltPercent100thsWithCompletionHandler:^(
            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 Test3aVerifyDutReportsOperationalStatusAttributeToThAfterADownOrClose_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint: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(@"3a: Verify DUT reports OperationalStatus attribute to TH after a DownOrClose Error: %@", err);

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

            VerifyOrReturn(CheckConstraintType("operationalStatus", "bitmap8", "bitmap8"));
            VerifyOrReturn(CheckConstraintMinValue<uint8_t>("operationalStatus", [value unsignedCharValue], 10U));
            VerifyOrReturn(CheckConstraintMaxValue<uint8_t>("operationalStatus", [value unsignedCharValue], 42U));

            NextTest();
        };

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test3a2DutUpdatesItsAttributes_15()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 2000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test3bIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionLiftPercent100thsWithCompletionHandler:^(
            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_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionLiftPercentageWithCompletionHandler:^(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_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionTiltPercent100thsWithCompletionHandler:^(
            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_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionTiltPercentageWithCompletionHandler:^(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_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster stopMotionWithCompletionHandler:^(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_21()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 3000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test4cVerifyDutUpdateOperationalStatusAttributeToThAfterAStopMotion_22()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletionHandler:^(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_23()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 1000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test5bIfPaLfThReadsTargetPositionLiftPercent100thsAttributeFromDut_24()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionLiftPercent100thsWithCompletionHandler:^(
            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_25()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionTiltPercent100thsWithCompletionHandler:^(
            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 : Report: 2: Subscribe to DUT reports on OperationalStatus attribute\n");
            err = TestReport2SubscribeToDutReportsOnOperationalStatusAttribute_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : 2: Subscribe to DUT reports on OperationalStatus attribute\n");
            err = Test2SubscribeToDutReportsOnOperationalStatusAttribute_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : 2a: TH sends a StopMotion command to DUT\n");
            if (ShouldSkip("WNCV.S.C02.Rsp")) {
                NextTest();
                return;
            }
            err = Test2aThSendsAStopMotionCommandToDut_7();
            break;
        case 8:
            ChipLogProgress(
                chipTool, " ***** Test Step 8 : 2b: TH waits for 3 seconds the end of inertial movement(s) on the device\n");
            err = Test2bThWaitsFor3SecondsTheEndOfInertialMovementsOnTheDevice_8();
            break;
        case 9:
            ChipLogProgress(
                chipTool, " ***** Test Step 9 : 2c: Verify DUT reports OperationalStatus attribute to TH after a StopMotion\n");
            if (ShouldSkip("WNCV.S.A000a")) {
                NextTest();
                return;
            }
            err = Test2cVerifyDutReportsOperationalStatusAttributeToThAfterAStopMotion_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : 2d: TH waits for 100ms - 3s attributes update on the device\n");
            err = Test2dThWaitsFor100ms3sAttributesUpdateOnTheDevice_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : 2e: TH reads OperationalStatus attribute from DUT\n");
            if (ShouldSkip("WNCV.S.A000a")) {
                NextTest();
                return;
            }
            err = Test2eThReadsOperationalStatusAttributeFromDut_11();
            break;
        case 12:
            ChipLogProgress(
                chipTool, " ***** Test Step 12 : 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_12();
            break;
        case 13:
            ChipLogProgress(chipTool,
                " ***** Test Step 13 : 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_13();
            break;
        case 14:
            ChipLogProgress(
                chipTool, " ***** Test Step 14 : 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_14();
            break;
        case 15:
            ChipLogProgress(chipTool,
                " ***** Test Step 15 : 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")) {
                NextTest();
                return;
            }
            err = Test4bIfPaTlThReadsTargetPositionTiltPercent100thsAttribute4cItMustBeEqualWithCurrentPositionTiltPercent100thsFromDut_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 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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster downOrCloseWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster upOrOpenWithCompletionHandler:^(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);
    }
    bool testSendClusterTest_TC_WNCV_3_3_5_WaitForReport_Fulfilled = false;
    ResponseHandler _Nullable test_Test_TC_WNCV_3_3_OperationalStatus_Reported = nil;

    CHIP_ERROR TestReport2SubscribeToDutReportsOnOperationalStatusAttribute_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint: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_5_WaitForReport_Fulfilled = true;
        };

        NextTest();
        return CHIP_NO_ERROR;
    }

    CHIP_ERROR Test2SubscribeToDutReportsOnOperationalStatusAttribute_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        uint16_t minIntervalArgument = 4U;
        uint16_t maxIntervalArgument = 5U;
        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] init];
        [cluster subscribeAttributeOperationalStatusWithMinInterval:[NSNumber numberWithUnsignedInt:minIntervalArgument]
            maxInterval:[NSNumber numberWithUnsignedInt:maxIntervalArgument]
            params:params
            subscriptionEstablished:^{
                VerifyOrReturn(
                    testSendClusterTest_TC_WNCV_3_3_5_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_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster stopMotionWithCompletionHandler:^(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_8()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 3000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test2cVerifyDutReportsOperationalStatusAttributeToThAfterAStopMotion_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint: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(@"2c: Verify DUT reports 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 Test2dThWaitsFor100ms3sAttributesUpdateOnTheDevice_10()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 2000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR Test2eThReadsOperationalStatusAttributeFromDut_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletionHandler:^(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_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionLiftPercent100thsWithCompletionHandler:^(
            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_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionLiftPercent100thsWithCompletionHandler:^(
            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_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionTiltPercent100thsWithCompletionHandler:^(
            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_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionTiltPercent100thsWithCompletionHandler:^(
            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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster downOrCloseWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster upOrOpenWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionLiftPercent100thsWithCompletionHandler:^(
            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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionLiftPercentageWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionTiltPercent100thsWithCompletionHandler:^(
            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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionTiltPercentageWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster upOrOpenWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster downOrCloseWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionLiftPercent100thsWithCompletionHandler:^(
            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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionLiftPercentageWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionTiltPercent100thsWithCompletionHandler:^(
            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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionTiltPercentageWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster downOrCloseWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionLiftPercent100thsWithCompletionHandler:^(
            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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRWindowCoveringClusterGoToLiftPercentageParams alloc] init];
        params.liftPercent100thsValue = [NSNumber numberWithUnsignedShort:2500U];
        [cluster goToLiftPercentageWithParams:params
                            completionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionLiftPercent100thsWithCompletionHandler:^(
            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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionLiftPercent100thsWithCompletionHandler:^(
            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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionLiftPercentageWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRWindowCoveringClusterGoToLiftPercentageParams alloc] init];
        params.liftPercent100thsValue = [NSNumber numberWithUnsignedShort:7520U];
        [cluster goToLiftPercentageWithParams:params
                            completionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionLiftPercent100thsWithCompletionHandler:^(
            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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionLiftPercent100thsWithCompletionHandler:^(
            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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionLiftPercentageWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster downOrCloseWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionTiltPercent100thsWithCompletionHandler:^(
            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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRWindowCoveringClusterGoToTiltPercentageParams alloc] init];
        params.tiltPercent100thsValue = [NSNumber numberWithUnsignedShort:3000U];
        [cluster goToTiltPercentageWithParams:params
                            completionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionTiltPercent100thsWithCompletionHandler:^(
            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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionTiltPercent100thsWithCompletionHandler:^(
            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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionTiltPercentageWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRWindowCoveringClusterGoToTiltPercentageParams alloc] init];
        params.tiltPercent100thsValue = [NSNumber numberWithUnsignedShort:6005U];
        [cluster goToTiltPercentageWithParams:params
                            completionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetPositionTiltPercent100thsWithCompletionHandler:^(
            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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOperationalStatusWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionTiltPercent100thsWithCompletionHandler:^(
            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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionTiltPercentageWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionLiftPercent100thsWithCompletionHandler:^(
            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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionLiftPercentageWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRWindowCoveringClusterGoToLiftPercentageParams alloc] init];
        params.liftPercent100thsValue = [NSNumber numberWithUnsignedShort:12288U];
        [cluster
            goToLiftPercentageWithParams:params
                       completionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRWindowCoveringClusterGoToLiftPercentageParams alloc] init];
        params.liftPercent100thsValue = [NSNumber numberWithUnsignedShort:10001U];
        [cluster
            goToLiftPercentageWithParams:params
                       completionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRWindowCoveringClusterGoToLiftPercentageParams alloc] init];
        params.liftPercent100thsValue = [NSNumber numberWithUnsignedShort:65535U];
        [cluster
            goToLiftPercentageWithParams:params
                       completionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionTiltPercent100thsWithCompletionHandler:^(
            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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeCurrentPositionTiltPercentageWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRWindowCoveringClusterGoToTiltPercentageParams alloc] init];
        params.tiltPercent100thsValue = [NSNumber numberWithUnsignedShort:12288U];
        [cluster
            goToTiltPercentageWithParams:params
                       completionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRWindowCoveringClusterGoToTiltPercentageParams alloc] init];
        params.tiltPercent100thsValue = [NSNumber numberWithUnsignedShort:10001U];
        [cluster
            goToTiltPercentageWithParams:params
                       completionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRWindowCoveringClusterGoToTiltPercentageParams alloc] init];
        params.tiltPercent100thsValue = [NSNumber numberWithUnsignedShort:65535U];
        [cluster
            goToTiltPercentageWithParams:params
                       completionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster upOrOpenWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRWindowCoveringClusterGoToLiftPercentageParams alloc] init];
        params.liftPercent100thsValue = [NSNumber numberWithUnsignedShort:9000U];
        [cluster goToLiftPercentageWithParams:params
                            completionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster stopMotionWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRWindowCoveringClusterGoToTiltPercentageParams alloc] init];
        params.tiltPercent100thsValue = [NSNumber numberWithUnsignedShort:9000U];
        [cluster goToTiltPercentageWithParams:params
                            completionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster stopMotionWithCompletionHandler:^(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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionLiftPercent100thsWithCompletionHandler:^(
            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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionTiltPercent100thsWithCompletionHandler:^(
            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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionLiftPercent100thsWithCompletionHandler:^(
            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");
        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
                                                                                             endpoint:1
                                                                                                queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentPositionTiltPercent100thsWithCompletionHandler:^(
            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");
        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
                                                                                               endpoint:1
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeTargetListWithCompletionHandler:^(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");
        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
                                                                                               endpoint:1
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentTargetWithCompletionHandler:^(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");
        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
                                                                                               endpoint: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
                        completionHandler:^(
                            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");
        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOutputListWithCompletionHandler:^(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");
        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentOutputWithCompletionHandler:^(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");
        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRAudioOutputClusterSelectOutputParams alloc] init];
        params.index = [NSNumber numberWithUnsignedChar:1U];
        [cluster selectOutputWithParams:params
                      completionHandler:^(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");
        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
                                                                                       endpoint: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
                      completionHandler:^(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");
        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

        [cluster readAttributeCurrentAppWithCompletionHandler:^(
            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");
        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
                                                                                                       endpoint: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
              completionHandler:^(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");
        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
                                                                                                       endpoint: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
            completionHandler:^(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");
        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
                                                                                                       endpoint: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
            completionHandler:^(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");
        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
        params.keyCode = [NSNumber numberWithUnsignedChar:3U];
        [cluster sendKeyWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterAccountLogin * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
                                                                                         endpoint:3
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRAccountLoginClusterGetSetupPINParams alloc] init];
        params.tempAccountIdentifier = @"asdf";
        [cluster
            getSetupPINWithParams:params
                completionHandler:^(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");
        MTRBaseClusterAccountLogin * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
                                                                                         endpoint: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
               completionHandler:^(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");
        MTRBaseClusterAccountLogin * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
                                                                                         endpoint:3
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster logoutWithCompletionHandler:^(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");
        MTRBaseClusterWakeOnLan * cluster = [[MTRBaseClusterWakeOnLan alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        __auto_type * params = [[MTRMediaPlaybackClusterSkipForwardParams alloc] init];
        params.deltaPositionMilliseconds = [NSNumber numberWithUnsignedLongLong:500ULL];
        [cluster
            skipForwardWithParams:params
                completionHandler:^(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");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                           endpoint:3
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

        __auto_type * params = [[MTRMediaPlaybackClusterSkipBackwardParams alloc] init];
        params.deltaPositionMilliseconds = [NSNumber numberWithUnsignedLongLong:100ULL];
        [cluster
            skipBackwardWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                           endpoint:3
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

        __auto_type * params = [[MTRMediaPlaybackClusterSeekParams alloc] init];
        params.position = [NSNumber numberWithUnsignedLongLong:1000ULL];
        [cluster seekWithParams:params
              completionHandler:^(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");
        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
                                                                                           endpoint:3
                                                                                              queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

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

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

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

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

        __auto_type * params = [[MTRChannelClusterChangeChannelParams alloc] init];
        params.match = @"PBS";
        [cluster
            changeChannelWithParams:params
                  completionHandler:^(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");
        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpoint: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
                               completionHandler:^(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");
        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRChannelClusterSkipChannelParams alloc] init];
        params.count = [NSNumber numberWithUnsignedShort:1U];
        [cluster skipChannelWithParams:params
                     completionHandler:^(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");
        MTRBaseClusterLowPower * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster sleepWithCompletionHandler:^(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");
        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
                                                                                               endpoint:1
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptHeaderWithCompletionHandler:^(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");
        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
                                                                                               endpoint:1
                                                                                                  queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeSupportedStreamingProtocolsWithCompletionHandler:^(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");
        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
                                                                                               endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
                                                                                               endpoint: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
                   completionHandler:^(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");
        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInputListWithCompletionHandler:^(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");
        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentInputWithCompletionHandler:^(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");
        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRMediaInputClusterSelectInputParams alloc] init];
        params.index = [NSNumber numberWithUnsignedChar:1U];
        [cluster selectInputWithParams:params
                     completionHandler:^(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");
        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster hideInputStatusWithCompletionHandler:^(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");
        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster showInputStatusWithCompletionHandler:^(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");
        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
                                                                                     endpoint: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
                     completionHandler:^(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");
        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInputListWithCompletionHandler:^(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");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeDataModelRevisionWithCompletionHandler:^(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");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeDataModelRevisionWithCompletionHandler:^(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");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeDataModelRevisionWithCompletionHandler:^(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 : Read attribute EPOCH_US Default Value\n");
            err = TestReadAttributeEpochUsDefaultValue_136();
            break;
        case 137:
            ChipLogProgress(chipTool, " ***** Test Step 137 : Write attribute EPOCH_US Max Value\n");
            err = TestWriteAttributeEpochUsMaxValue_137();
            break;
        case 138:
            ChipLogProgress(chipTool, " ***** Test Step 138 : Read attribute EPOCH_US Max Value\n");
            err = TestReadAttributeEpochUsMaxValue_138();
            break;
        case 139:
            ChipLogProgress(chipTool, " ***** Test Step 139 : Write attribute EPOCH_US Min Value\n");
            err = TestWriteAttributeEpochUsMinValue_139();
            break;
        case 140:
            ChipLogProgress(chipTool, " ***** Test Step 140 : Read attribute EPOCH_US Min Value\n");
            err = TestReadAttributeEpochUsMinValue_140();
            break;
        case 141:
            ChipLogProgress(chipTool, " ***** Test Step 141 : Read attribute EPOCH_S Default Value\n");
            err = TestReadAttributeEpochSDefaultValue_141();
            break;
        case 142:
            ChipLogProgress(chipTool, " ***** Test Step 142 : Write attribute EPOCH_S Max Value\n");
            err = TestWriteAttributeEpochSMaxValue_142();
            break;
        case 143:
            ChipLogProgress(chipTool, " ***** Test Step 143 : Read attribute EPOCH_S Max Value\n");
            err = TestReadAttributeEpochSMaxValue_143();
            break;
        case 144:
            ChipLogProgress(chipTool, " ***** Test Step 144 : Write attribute EPOCH_S Min Value\n");
            err = TestWriteAttributeEpochSMinValue_144();
            break;
        case 145:
            ChipLogProgress(chipTool, " ***** Test Step 145 : Read attribute EPOCH_S Min Value\n");
            err = TestReadAttributeEpochSMinValue_145();
            break;
        case 146:
            ChipLogProgress(chipTool, " ***** Test Step 146 : Read attribute UNSUPPORTED\n");
            err = TestReadAttributeUnsupported_146();
            break;
        case 147:
            ChipLogProgress(chipTool, " ***** Test Step 147 : Writeattribute UNSUPPORTED\n");
            err = TestWriteattributeUnsupported_147();
            break;
        case 148:
            ChipLogProgress(chipTool, " ***** Test Step 148 : Send Test Command to unsupported endpoint\n");
            err = TestSendTestCommandToUnsupportedEndpoint_148();
            break;
        case 149:
            ChipLogProgress(chipTool, " ***** Test Step 149 : Send Test Command to unsupported cluster\n");
            err = TestSendTestCommandToUnsupportedCluster_149();
            break;
        case 150:
            ChipLogProgress(chipTool, " ***** Test Step 150 : Read attribute vendor_id Default Value\n");
            err = TestReadAttributeVendorIdDefaultValue_150();
            break;
        case 151:
            ChipLogProgress(chipTool, " ***** Test Step 151 : Write attribute vendor_id\n");
            err = TestWriteAttributeVendorId_151();
            break;
        case 152:
            ChipLogProgress(chipTool, " ***** Test Step 152 : Read attribute vendor_id\n");
            err = TestReadAttributeVendorId_152();
            break;
        case 153:
            ChipLogProgress(chipTool, " ***** Test Step 153 : Restore attribute vendor_id\n");
            err = TestRestoreAttributeVendorId_153();
            break;
        case 154:
            ChipLogProgress(chipTool, " ***** Test Step 154 : Send a command with a vendor_id and enum\n");
            err = TestSendACommandWithAVendorIdAndEnum_154();
            break;
        case 155:
            ChipLogProgress(chipTool, " ***** Test Step 155 : Send a command with a vendor_id and invalid enum\n");
            err = TestSendACommandWithAVendorIdAndInvalidEnum_155();
            break;
        case 156:
            ChipLogProgress(chipTool, " ***** Test Step 156 : Send Test Command With Struct Argument and arg1.b is true\n");
            err = TestSendTestCommandWithStructArgumentAndArg1bIsTrue_156();
            break;
        case 157:
            ChipLogProgress(chipTool, " ***** Test Step 157 : Send Test Command With Struct Argument and arg1.b is false\n");
            err = TestSendTestCommandWithStructArgumentAndArg1bIsFalse_157();
            break;
        case 158:
            ChipLogProgress(
                chipTool, " ***** Test Step 158 : Send Test Command With Nested Struct Argument and arg1.c.b is true\n");
            err = TestSendTestCommandWithNestedStructArgumentAndArg1cbIsTrue_158();
            break;
        case 159:
            ChipLogProgress(chipTool, " ***** Test Step 159 : Send Test Command With Nested Struct Argument arg1.c.b is false\n");
            err = TestSendTestCommandWithNestedStructArgumentArg1cbIsFalse_159();
            break;
        case 160:
            ChipLogProgress(chipTool,
                " ***** Test Step 160 : Send Test Command With Nested Struct List Argument and all fields b of arg1.d are true\n");
            err = TestSendTestCommandWithNestedStructListArgumentAndAllFieldsBOfArg1dAreTrue_160();
            break;
        case 161:
            ChipLogProgress(chipTool,
                " ***** Test Step 161 : Send Test Command With Nested Struct List Argument and some fields b of arg1.d are "
                "false\n");
            err = TestSendTestCommandWithNestedStructListArgumentAndSomeFieldsBOfArg1dAreFalse_161();
            break;
        case 162:
            ChipLogProgress(chipTool, " ***** Test Step 162 : Send Test Command With Struct Argument and see what we get back\n");
            err = TestSendTestCommandWithStructArgumentAndSeeWhatWeGetBack_162();
            break;
        case 163:
            ChipLogProgress(chipTool, " ***** Test Step 163 : Send Test Command With List of INT8U and none of them is set to 0\n");
            err = TestSendTestCommandWithListOfInt8uAndNoneOfThemIsSetTo0_163();
            break;
        case 164:
            ChipLogProgress(chipTool, " ***** Test Step 164 : Send Test Command With List of INT8U and one of them is set to 0\n");
            err = TestSendTestCommandWithListOfInt8uAndOneOfThemIsSetTo0_164();
            break;
        case 165:
            ChipLogProgress(chipTool, " ***** Test Step 165 : Send Test Command With List of INT8U and get it reversed\n");
            err = TestSendTestCommandWithListOfInt8uAndGetItReversed_165();
            break;
        case 166:
            ChipLogProgress(
                chipTool, " ***** Test Step 166 : Send Test Command With empty List of INT8U and get an empty list back\n");
            err = TestSendTestCommandWithEmptyListOfInt8uAndGetAnEmptyListBack_166();
            break;
        case 167:
            ChipLogProgress(chipTool,
                " ***** Test Step 167 : Send Test Command With List of Struct Argument and arg1.b of first item is true\n");
            err = TestSendTestCommandWithListOfStructArgumentAndArg1bOfFirstItemIsTrue_167();
            break;
        case 168:
            ChipLogProgress(chipTool,
                " ***** Test Step 168 : Send Test Command With List of Struct Argument and arg1.b of first item is false\n");
            err = TestSendTestCommandWithListOfStructArgumentAndArg1bOfFirstItemIsFalse_168();
            break;
        case 169:
            ChipLogProgress(chipTool,
                " ***** Test Step 169 : Send Test Command With List of Nested Struct List Argument and all fields b of elements of "
                "arg1.d are true\n");
            err = TestSendTestCommandWithListOfNestedStructListArgumentAndAllFieldsBOfElementsOfArg1dAreTrue_169();
            break;
        case 170:
            ChipLogProgress(chipTool,
                " ***** Test Step 170 : Send Test Command With Nested Struct List Argument and some fields b of elements of arg1.d "
                "are false\n");
            err = TestSendTestCommandWithNestedStructListArgumentAndSomeFieldsBOfElementsOfArg1dAreFalse_170();
            break;
        case 171:
            ChipLogProgress(
                chipTool, " ***** Test Step 171 : Write attribute LIST With List of INT8U and none of them is set to 0\n");
            err = TestWriteAttributeListWithListOfInt8uAndNoneOfThemIsSetTo0_171();
            break;
        case 172:
            ChipLogProgress(chipTool, " ***** Test Step 172 : Read attribute LIST With List of INT8U\n");
            err = TestReadAttributeListWithListOfInt8u_172();
            break;
        case 173:
            ChipLogProgress(chipTool, " ***** Test Step 173 : Write attribute LIST With List of OCTET_STRING\n");
            err = TestWriteAttributeListWithListOfOctetString_173();
            break;
        case 174:
            ChipLogProgress(chipTool, " ***** Test Step 174 : Read attribute LIST With List of OCTET_STRING\n");
            err = TestReadAttributeListWithListOfOctetString_174();
            break;
        case 175:
            ChipLogProgress(chipTool, " ***** Test Step 175 : Write attribute LIST With List of LIST_STRUCT_OCTET_STRING\n");
            err = TestWriteAttributeListWithListOfListStructOctetString_175();
            break;
        case 176:
            ChipLogProgress(chipTool, " ***** Test Step 176 : Read attribute LIST With List of LIST_STRUCT_OCTET_STRING\n");
            err = TestReadAttributeListWithListOfListStructOctetString_176();
            break;
        case 177:
            ChipLogProgress(chipTool, " ***** Test Step 177 : Send Test Command with optional arg set.\n");
            err = TestSendTestCommandWithOptionalArgSet_177();
            break;
        case 178:
            ChipLogProgress(chipTool, " ***** Test Step 178 : Send Test Command without its optional arg.\n");
            err = TestSendTestCommandWithoutItsOptionalArg_178();
            break;
        case 179:
            ChipLogProgress(chipTool, " ***** Test Step 179 : Read list of structs containing nullables and optionals\n");
            err = TestReadListOfStructsContainingNullablesAndOptionals_179();
            break;
        case 180:
            ChipLogProgress(chipTool, " ***** Test Step 180 : Write list of structs containing nullables and optionals\n");
            err = TestWriteListOfStructsContainingNullablesAndOptionals_180();
            break;
        case 181:
            ChipLogProgress(
                chipTool, " ***** Test Step 181 : Read list of structs containing nullables and optionals after writing\n");
            err = TestReadListOfStructsContainingNullablesAndOptionalsAfterWriting_181();
            break;
        case 182:
            ChipLogProgress(chipTool, " ***** Test Step 182 : Write attribute NULLABLE_BOOLEAN null\n");
            err = TestWriteAttributeNullableBooleanNull_182();
            break;
        case 183:
            ChipLogProgress(chipTool, " ***** Test Step 183 : Read attribute NULLABLE_BOOLEAN null\n");
            err = TestReadAttributeNullableBooleanNull_183();
            break;
        case 184:
            ChipLogProgress(chipTool, " ***** Test Step 184 : Write attribute NULLABLE_BOOLEAN True\n");
            err = TestWriteAttributeNullableBooleanTrue_184();
            break;
        case 185:
            ChipLogProgress(chipTool, " ***** Test Step 185 : Read attribute NULLABLE_BOOLEAN True\n");
            err = TestReadAttributeNullableBooleanTrue_185();
            break;
        case 186:
            ChipLogProgress(chipTool, " ***** Test Step 186 : Read attribute NULLABLE_BOOLEAN not null\n");
            err = TestReadAttributeNullableBooleanNotNull_186();
            break;
        case 187:
            ChipLogProgress(chipTool, " ***** Test Step 187 : Write attribute NULLABLE_BITMAP8 Max Value\n");
            err = TestWriteAttributeNullableBitmap8MaxValue_187();
            break;
        case 188:
            ChipLogProgress(chipTool, " ***** Test Step 188 : Read attribute NULLABLE_BITMAP8 Max Value\n");
            err = TestReadAttributeNullableBitmap8MaxValue_188();
            break;
        case 189:
            ChipLogProgress(chipTool, " ***** Test Step 189 : Write attribute NULLABLE_BITMAP8 Invalid Value\n");
            err = TestWriteAttributeNullableBitmap8InvalidValue_189();
            break;
        case 190:
            ChipLogProgress(chipTool, " ***** Test Step 190 : Read attribute NULLABLE_BITMAP8 unchanged Value\n");
            err = TestReadAttributeNullableBitmap8UnchangedValue_190();
            break;
        case 191:
            ChipLogProgress(chipTool, " ***** Test Step 191 : Write attribute NULLABLE_BITMAP8 null Value\n");
            err = TestWriteAttributeNullableBitmap8NullValue_191();
            break;
        case 192:
            ChipLogProgress(chipTool, " ***** Test Step 192 : Read attribute NULLABLE_BITMAP8 null Value\n");
            err = TestReadAttributeNullableBitmap8NullValue_192();
            break;
        case 193:
            ChipLogProgress(chipTool, " ***** Test Step 193 : Read attribute NULLABLE_BITMAP8 not 254 Value\n");
            err = TestReadAttributeNullableBitmap8Not254Value_193();
            break;
        case 194:
            ChipLogProgress(chipTool, " ***** Test Step 194 : Write attribute NULLABLE_BITMAP16 Max Value\n");
            err = TestWriteAttributeNullableBitmap16MaxValue_194();
            break;
        case 195:
            ChipLogProgress(chipTool, " ***** Test Step 195 : Read attribute NULLABLE_BITMAP16 Max Value\n");
            err = TestReadAttributeNullableBitmap16MaxValue_195();
            break;
        case 196:
            ChipLogProgress(chipTool, " ***** Test Step 196 : Write attribute NULLABLE_BITMAP16 Invalid Value\n");
            err = TestWriteAttributeNullableBitmap16InvalidValue_196();
            break;
        case 197:
            ChipLogProgress(chipTool, " ***** Test Step 197 : Read attribute NULLABLE_BITMAP16 unchanged Value\n");
            err = TestReadAttributeNullableBitmap16UnchangedValue_197();
            break;
        case 198:
            ChipLogProgress(chipTool, " ***** Test Step 198 : Write attribute NULLABLE_BITMAP16 null Value\n");
            err = TestWriteAttributeNullableBitmap16NullValue_198();
            break;
        case 199:
            ChipLogProgress(chipTool, " ***** Test Step 199 : Read attribute NULLABLE_BITMAP16 null Value\n");
            err = TestReadAttributeNullableBitmap16NullValue_199();
            break;
        case 200:
            ChipLogProgress(chipTool, " ***** Test Step 200 : Write attribute NULLABLE_BITMAP32 Max Value\n");
            err = TestWriteAttributeNullableBitmap32MaxValue_200();
            break;
        case 201:
            ChipLogProgress(chipTool, " ***** Test Step 201 : Read attribute NULLABLE_BITMAP32 Max Value\n");
            err = TestReadAttributeNullableBitmap32MaxValue_201();
            break;
        case 202:
            ChipLogProgress(chipTool, " ***** Test Step 202 : Write attribute NULLABLE_BITMAP32 Invalid Value\n");
            err = TestWriteAttributeNullableBitmap32InvalidValue_202();
            break;
        case 203:
            ChipLogProgress(chipTool, " ***** Test Step 203 : Read attribute NULLABLE_BITMAP32 unchanged Value\n");
            err = TestReadAttributeNullableBitmap32UnchangedValue_203();
            break;
        case 204:
            ChipLogProgress(chipTool, " ***** Test Step 204 : Write attribute NULLABLE_BITMAP32 null Value\n");
            err = TestWriteAttributeNullableBitmap32NullValue_204();
            break;
        case 205:
            ChipLogProgress(chipTool, " ***** Test Step 205 : Read attribute NULLABLE_BITMAP32 null Value\n");
            err = TestReadAttributeNullableBitmap32NullValue_205();
            break;
        case 206:
            ChipLogProgress(chipTool, " ***** Test Step 206 : Write attribute NULLABLE_BITMAP64 Max Value\n");
            err = TestWriteAttributeNullableBitmap64MaxValue_206();
            break;
        case 207:
            ChipLogProgress(chipTool, " ***** Test Step 207 : Read attribute NULLABLE_BITMAP64 Max Value\n");
            err = TestReadAttributeNullableBitmap64MaxValue_207();
            break;
        case 208:
            ChipLogProgress(chipTool, " ***** Test Step 208 : Write attribute NULLABLE_BITMAP64 Invalid Value\n");
            err = TestWriteAttributeNullableBitmap64InvalidValue_208();
            break;
        case 209:
            ChipLogProgress(chipTool, " ***** Test Step 209 : Read attribute NULLABLE_BITMAP64 unchanged Value\n");
            err = TestReadAttributeNullableBitmap64UnchangedValue_209();
            break;
        case 210:
            ChipLogProgress(chipTool, " ***** Test Step 210 : Write attribute NULLABLE_BITMAP64 null Value\n");
            err = TestWriteAttributeNullableBitmap64NullValue_210();
            break;
        case 211:
            ChipLogProgress(chipTool, " ***** Test Step 211 : Read attribute NULLABLE_BITMAP64 null Value\n");
            err = TestReadAttributeNullableBitmap64NullValue_211();
            break;
        case 212:
            ChipLogProgress(chipTool, " ***** Test Step 212 : Write attribute NULLABLE_INT8U Min Value\n");
            err = TestWriteAttributeNullableInt8uMinValue_212();
            break;
        case 213:
            ChipLogProgress(chipTool, " ***** Test Step 213 : Read attribute NULLABLE_INT8U Min Value\n");
            err = TestReadAttributeNullableInt8uMinValue_213();
            break;
        case 214:
            ChipLogProgress(chipTool, " ***** Test Step 214 : Write attribute NULLABLE_INT8U Max Value\n");
            err = TestWriteAttributeNullableInt8uMaxValue_214();
            break;
        case 215:
            ChipLogProgress(chipTool, " ***** Test Step 215 : Read attribute NULLABLE_INT8U Max Value\n");
            err = TestReadAttributeNullableInt8uMaxValue_215();
            break;
        case 216:
            ChipLogProgress(chipTool, " ***** Test Step 216 : Write attribute NULLABLE_INT8U Invalid Value\n");
            err = TestWriteAttributeNullableInt8uInvalidValue_216();
            break;
        case 217:
            ChipLogProgress(chipTool, " ***** Test Step 217 : Read attribute NULLABLE_INT8U unchanged Value\n");
            err = TestReadAttributeNullableInt8uUnchangedValue_217();
            break;
        case 218:
            ChipLogProgress(chipTool, " ***** Test Step 218 : Read attribute NULLABLE_INT8U unchanged Value with constraint\n");
            err = TestReadAttributeNullableInt8uUnchangedValueWithConstraint_218();
            break;
        case 219:
            ChipLogProgress(chipTool, " ***** Test Step 219 : Write attribute NULLABLE_INT8U null Value\n");
            err = TestWriteAttributeNullableInt8uNullValue_219();
            break;
        case 220:
            ChipLogProgress(chipTool, " ***** Test Step 220 : Read attribute NULLABLE_INT8U null Value\n");
            err = TestReadAttributeNullableInt8uNullValue_220();
            break;
        case 221:
            ChipLogProgress(chipTool, " ***** Test Step 221 : Read attribute NULLABLE_INT8U null Value & range\n");
            err = TestReadAttributeNullableInt8uNullValueRange_221();
            break;
        case 222:
            ChipLogProgress(chipTool, " ***** Test Step 222 : Read attribute NULLABLE_INT8U null Value & not\n");
            err = TestReadAttributeNullableInt8uNullValueNot_222();
            break;
        case 223:
            ChipLogProgress(chipTool, " ***** Test Step 223 : Write attribute NULLABLE_INT8U Value\n");
            err = TestWriteAttributeNullableInt8uValue_223();
            break;
        case 224:
            ChipLogProgress(chipTool, " ***** Test Step 224 : Read attribute NULLABLE_INT8U Value in range\n");
            err = TestReadAttributeNullableInt8uValueInRange_224();
            break;
        case 225:
            ChipLogProgress(chipTool, " ***** Test Step 225 : Read attribute NULLABLE_INT8U notValue OK\n");
            err = TestReadAttributeNullableInt8uNotValueOk_225();
            break;
        case 226:
            ChipLogProgress(chipTool, " ***** Test Step 226 : Write attribute NULLABLE_INT16U Min Value\n");
            err = TestWriteAttributeNullableInt16uMinValue_226();
            break;
        case 227:
            ChipLogProgress(chipTool, " ***** Test Step 227 : Read attribute NULLABLE_INT16U Min Value\n");
            err = TestReadAttributeNullableInt16uMinValue_227();
            break;
        case 228:
            ChipLogProgress(chipTool, " ***** Test Step 228 : Write attribute NULLABLE_INT16U Max Value\n");
            err = TestWriteAttributeNullableInt16uMaxValue_228();
            break;
        case 229:
            ChipLogProgress(chipTool, " ***** Test Step 229 : Read attribute NULLABLE_INT16U Max Value\n");
            err = TestReadAttributeNullableInt16uMaxValue_229();
            break;
        case 230:
            ChipLogProgress(chipTool, " ***** Test Step 230 : Write attribute NULLABLE_INT16U Invalid Value\n");
            err = TestWriteAttributeNullableInt16uInvalidValue_230();
            break;
        case 231:
            ChipLogProgress(chipTool, " ***** Test Step 231 : Read attribute NULLABLE_INT16U unchanged Value\n");
            err = TestReadAttributeNullableInt16uUnchangedValue_231();
            break;
        case 232:
            ChipLogProgress(chipTool, " ***** Test Step 232 : Write attribute NULLABLE_INT16U null Value\n");
            err = TestWriteAttributeNullableInt16uNullValue_232();
            break;
        case 233:
            ChipLogProgress(chipTool, " ***** Test Step 233 : Read attribute NULLABLE_INT16U null Value\n");
            err = TestReadAttributeNullableInt16uNullValue_233();
            break;
        case 234:
            ChipLogProgress(chipTool, " ***** Test Step 234 : Read attribute NULLABLE_INT16U null Value & range\n");
            err = TestReadAttributeNullableInt16uNullValueRange_234();
            break;
        case 235:
            ChipLogProgress(chipTool, " ***** Test Step 235 : Read attribute NULLABLE_INT16U null Value & not\n");
            err = TestReadAttributeNullableInt16uNullValueNot_235();
            break;
        case 236:
            ChipLogProgress(chipTool, " ***** Test Step 236 : Write attribute NULLABLE_INT16U Value\n");
            err = TestWriteAttributeNullableInt16uValue_236();
            break;
        case 237:
            ChipLogProgress(chipTool, " ***** Test Step 237 : Read attribute NULLABLE_INT16U Value in range\n");
            err = TestReadAttributeNullableInt16uValueInRange_237();
            break;
        case 238:
            ChipLogProgress(chipTool, " ***** Test Step 238 : Read attribute NULLABLE_INT16U notValue OK\n");
            err = TestReadAttributeNullableInt16uNotValueOk_238();
            break;
        case 239:
            ChipLogProgress(chipTool, " ***** Test Step 239 : Write attribute NULLABLE_INT32U Min Value\n");
            err = TestWriteAttributeNullableInt32uMinValue_239();
            break;
        case 240:
            ChipLogProgress(chipTool, " ***** Test Step 240 : Read attribute NULLABLE_INT32U Min Value\n");
            err = TestReadAttributeNullableInt32uMinValue_240();
            break;
        case 241:
            ChipLogProgress(chipTool, " ***** Test Step 241 : Write attribute NULLABLE_INT32U Max Value\n");
            err = TestWriteAttributeNullableInt32uMaxValue_241();
            break;
        case 242:
            ChipLogProgress(chipTool, " ***** Test Step 242 : Read attribute NULLABLE_INT32U Max Value\n");
            err = TestReadAttributeNullableInt32uMaxValue_242();
            break;
        case 243:
            ChipLogProgress(chipTool, " ***** Test Step 243 : Write attribute NULLABLE_INT32U Invalid Value\n");
            err = TestWriteAttributeNullableInt32uInvalidValue_243();
            break;
        case 244:
            ChipLogProgress(chipTool, " ***** Test Step 244 : Read attribute NULLABLE_INT32U unchanged Value\n");
            err = TestReadAttributeNullableInt32uUnchangedValue_244();
            break;
        case 245:
            ChipLogProgress(chipTool, " ***** Test Step 245 : Write attribute NULLABLE_INT32U null Value\n");
            err = TestWriteAttributeNullableInt32uNullValue_245();
            break;
        case 246:
            ChipLogProgress(chipTool, " ***** Test Step 246 : Read attribute NULLABLE_INT32U null Value\n");
            err = TestReadAttributeNullableInt32uNullValue_246();
            break;
        case 247:
            ChipLogProgress(chipTool, " ***** Test Step 247 : Read attribute NULLABLE_INT32U null Value & range\n");
            err = TestReadAttributeNullableInt32uNullValueRange_247();
            break;
        case 248:
            ChipLogProgress(chipTool, " ***** Test Step 248 : Read attribute NULLABLE_INT32U null Value & not\n");
            err = TestReadAttributeNullableInt32uNullValueNot_248();
            break;
        case 249:
            ChipLogProgress(chipTool, " ***** Test Step 249 : Write attribute NULLABLE_INT32U Value\n");
            err = TestWriteAttributeNullableInt32uValue_249();
            break;
        case 250:
            ChipLogProgress(chipTool, " ***** Test Step 250 : Read attribute NULLABLE_INT32U Value in range\n");
            err = TestReadAttributeNullableInt32uValueInRange_250();
            break;
        case 251:
            ChipLogProgress(chipTool, " ***** Test Step 251 : Read attribute NULLABLE_INT32U notValue OK\n");
            err = TestReadAttributeNullableInt32uNotValueOk_251();
            break;
        case 252:
            ChipLogProgress(chipTool, " ***** Test Step 252 : Write attribute NULLABLE_INT64U Min Value\n");
            err = TestWriteAttributeNullableInt64uMinValue_252();
            break;
        case 253:
            ChipLogProgress(chipTool, " ***** Test Step 253 : Read attribute NULLABLE_INT64U Min Value\n");
            err = TestReadAttributeNullableInt64uMinValue_253();
            break;
        case 254:
            ChipLogProgress(chipTool, " ***** Test Step 254 : Write attribute NULLABLE_INT64U Max Value\n");
            err = TestWriteAttributeNullableInt64uMaxValue_254();
            break;
        case 255:
            ChipLogProgress(chipTool, " ***** Test Step 255 : Read attribute NULLABLE_INT64U Max Value\n");
            err = TestReadAttributeNullableInt64uMaxValue_255();
            break;
        case 256:
            ChipLogProgress(chipTool, " ***** Test Step 256 : Write attribute NULLABLE_INT64U Invalid Value\n");
            err = TestWriteAttributeNullableInt64uInvalidValue_256();
            break;
        case 257:
            ChipLogProgress(chipTool, " ***** Test Step 257 : Read attribute NULLABLE_INT64U unchanged Value\n");
            err = TestReadAttributeNullableInt64uUnchangedValue_257();
            break;
        case 258:
            ChipLogProgress(chipTool, " ***** Test Step 258 : Write attribute NULLABLE_INT64U null Value\n");
            err = TestWriteAttributeNullableInt64uNullValue_258();
            break;
        case 259:
            ChipLogProgress(chipTool, " ***** Test Step 259 : Read attribute NULLABLE_INT64U null Value\n");
            err = TestReadAttributeNullableInt64uNullValue_259();
            break;
        case 260:
            ChipLogProgress(chipTool, " ***** Test Step 260 : Read attribute NULLABLE_INT64U null Value & range\n");
            err = TestReadAttributeNullableInt64uNullValueRange_260();
            break;
        case 261:
            ChipLogProgress(chipTool, " ***** Test Step 261 : Read attribute NULLABLE_INT64U null Value & not\n");
            err = TestReadAttributeNullableInt64uNullValueNot_261();
            break;
        case 262:
            ChipLogProgress(chipTool, " ***** Test Step 262 : Write attribute NULLABLE_INT64U Value\n");
            err = TestWriteAttributeNullableInt64uValue_262();
            break;
        case 263:
            ChipLogProgress(chipTool, " ***** Test Step 263 : Read attribute NULLABLE_INT64U Value in range\n");
            err = TestReadAttributeNullableInt64uValueInRange_263();
            break;
        case 264:
            ChipLogProgress(chipTool, " ***** Test Step 264 : Read attribute NULLABLE_INT64U notValue OK\n");
            err = TestReadAttributeNullableInt64uNotValueOk_264();
            break;
        case 265:
            ChipLogProgress(chipTool, " ***** Test Step 265 : Write attribute NULLABLE_INT8S Min Value\n");
            err = TestWriteAttributeNullableInt8sMinValue_265();
            break;
        case 266:
            ChipLogProgress(chipTool, " ***** Test Step 266 : Read attribute NULLABLE_INT8S Min Value\n");
            err = TestReadAttributeNullableInt8sMinValue_266();
            break;
        case 267:
            ChipLogProgress(chipTool, " ***** Test Step 267 : Write attribute NULLABLE_INT8S Invalid Value\n");
            err = TestWriteAttributeNullableInt8sInvalidValue_267();
            break;
        case 268:
            ChipLogProgress(chipTool, " ***** Test Step 268 : Read attribute NULLABLE_INT8S unchanged Value\n");
            err = TestReadAttributeNullableInt8sUnchangedValue_268();
            break;
        case 269:
            ChipLogProgress(chipTool, " ***** Test Step 269 : Write attribute NULLABLE_INT8S null Value\n");
            err = TestWriteAttributeNullableInt8sNullValue_269();
            break;
        case 270:
            ChipLogProgress(chipTool, " ***** Test Step 270 : Read attribute NULLABLE_INT8S null Value\n");
            err = TestReadAttributeNullableInt8sNullValue_270();
            break;
        case 271:
            ChipLogProgress(chipTool, " ***** Test Step 271 : Read attribute NULLABLE_INT8S null Value & range\n");
            err = TestReadAttributeNullableInt8sNullValueRange_271();
            break;
        case 272:
            ChipLogProgress(chipTool, " ***** Test Step 272 : Read attribute NULLABLE_INT8S null Value & not\n");
            err = TestReadAttributeNullableInt8sNullValueNot_272();
            break;
        case 273:
            ChipLogProgress(chipTool, " ***** Test Step 273 : Write attribute NULLABLE_INT8S Value\n");
            err = TestWriteAttributeNullableInt8sValue_273();
            break;
        case 274:
            ChipLogProgress(chipTool, " ***** Test Step 274 : Read attribute NULLABLE_INT8S Value in range\n");
            err = TestReadAttributeNullableInt8sValueInRange_274();
            break;
        case 275:
            ChipLogProgress(chipTool, " ***** Test Step 275 : Read attribute NULLABLE_INT8S notValue OK\n");
            err = TestReadAttributeNullableInt8sNotValueOk_275();
            break;
        case 276:
            ChipLogProgress(chipTool, " ***** Test Step 276 : Write attribute NULLABLE_INT16S Min Value\n");
            err = TestWriteAttributeNullableInt16sMinValue_276();
            break;
        case 277:
            ChipLogProgress(chipTool, " ***** Test Step 277 : Read attribute NULLABLE_INT16S Min Value\n");
            err = TestReadAttributeNullableInt16sMinValue_277();
            break;
        case 278:
            ChipLogProgress(chipTool, " ***** Test Step 278 : Write attribute NULLABLE_INT16S Invalid Value\n");
            err = TestWriteAttributeNullableInt16sInvalidValue_278();
            break;
        case 279:
            ChipLogProgress(chipTool, " ***** Test Step 279 : Read attribute NULLABLE_INT16S unchanged Value\n");
            err = TestReadAttributeNullableInt16sUnchangedValue_279();
            break;
        case 280:
            ChipLogProgress(chipTool, " ***** Test Step 280 : Write attribute NULLABLE_INT16S null Value\n");
            err = TestWriteAttributeNullableInt16sNullValue_280();
            break;
        case 281:
            ChipLogProgress(chipTool, " ***** Test Step 281 : Read attribute NULLABLE_INT16S null Value\n");
            err = TestReadAttributeNullableInt16sNullValue_281();
            break;
        case 282:
            ChipLogProgress(chipTool, " ***** Test Step 282 : Read attribute NULLABLE_INT16S null Value & range\n");
            err = TestReadAttributeNullableInt16sNullValueRange_282();
            break;
        case 283:
            ChipLogProgress(chipTool, " ***** Test Step 283 : Read attribute NULLABLE_INT16S null Value & not\n");
            err = TestReadAttributeNullableInt16sNullValueNot_283();
            break;
        case 284:
            ChipLogProgress(chipTool, " ***** Test Step 284 : Write attribute NULLABLE_INT16S Value\n");
            err = TestWriteAttributeNullableInt16sValue_284();
            break;
        case 285:
            ChipLogProgress(chipTool, " ***** Test Step 285 : Read attribute NULLABLE_INT16S Value in range\n");
            err = TestReadAttributeNullableInt16sValueInRange_285();
            break;
        case 286:
            ChipLogProgress(chipTool, " ***** Test Step 286 : Read attribute NULLABLE_INT16S notValue OK\n");
            err = TestReadAttributeNullableInt16sNotValueOk_286();
            break;
        case 287:
            ChipLogProgress(chipTool, " ***** Test Step 287 : Write attribute NULLABLE_INT32S Min Value\n");
            err = TestWriteAttributeNullableInt32sMinValue_287();
            break;
        case 288:
            ChipLogProgress(chipTool, " ***** Test Step 288 : Read attribute NULLABLE_INT32S Min Value\n");
            err = TestReadAttributeNullableInt32sMinValue_288();
            break;
        case 289:
            ChipLogProgress(chipTool, " ***** Test Step 289 : Write attribute NULLABLE_INT32S Invalid Value\n");
            err = TestWriteAttributeNullableInt32sInvalidValue_289();
            break;
        case 290:
            ChipLogProgress(chipTool, " ***** Test Step 290 : Read attribute NULLABLE_INT32S unchanged Value\n");
            err = TestReadAttributeNullableInt32sUnchangedValue_290();
            break;
        case 291:
            ChipLogProgress(chipTool, " ***** Test Step 291 : Write attribute NULLABLE_INT32S null Value\n");
            err = TestWriteAttributeNullableInt32sNullValue_291();
            break;
        case 292:
            ChipLogProgress(chipTool, " ***** Test Step 292 : Read attribute NULLABLE_INT32S null Value\n");
            err = TestReadAttributeNullableInt32sNullValue_292();
            break;
        case 293:
            ChipLogProgress(chipTool, " ***** Test Step 293 : Read attribute NULLABLE_INT32S null Value & range\n");
            err = TestReadAttributeNullableInt32sNullValueRange_293();
            break;
        case 294:
            ChipLogProgress(chipTool, " ***** Test Step 294 : Read attribute NULLABLE_INT32S null Value & not\n");
            err = TestReadAttributeNullableInt32sNullValueNot_294();
            break;
        case 295:
            ChipLogProgress(chipTool, " ***** Test Step 295 : Write attribute NULLABLE_INT32S Value\n");
            err = TestWriteAttributeNullableInt32sValue_295();
            break;
        case 296:
            ChipLogProgress(chipTool, " ***** Test Step 296 : Read attribute NULLABLE_INT32S Value in range\n");
            err = TestReadAttributeNullableInt32sValueInRange_296();
            break;
        case 297:
            ChipLogProgress(chipTool, " ***** Test Step 297 : Read attribute NULLABLE_INT32S notValue OK\n");
            err = TestReadAttributeNullableInt32sNotValueOk_297();
            break;
        case 298:
            ChipLogProgress(chipTool, " ***** Test Step 298 : Write attribute NULLABLE_INT64S Min Value\n");
            err = TestWriteAttributeNullableInt64sMinValue_298();
            break;
        case 299:
            ChipLogProgress(chipTool, " ***** Test Step 299 : Read attribute NULLABLE_INT64S Min Value\n");
            err = TestReadAttributeNullableInt64sMinValue_299();
            break;
        case 300:
            ChipLogProgress(chipTool, " ***** Test Step 300 : Write attribute NULLABLE_INT64S Invalid Value\n");
            err = TestWriteAttributeNullableInt64sInvalidValue_300();
            break;
        case 301:
            ChipLogProgress(chipTool, " ***** Test Step 301 : Read attribute NULLABLE_INT64S unchanged Value\n");
            err = TestReadAttributeNullableInt64sUnchangedValue_301();
            break;
        case 302:
            ChipLogProgress(chipTool, " ***** Test Step 302 : Write attribute NULLABLE_INT64S null Value\n");
            err = TestWriteAttributeNullableInt64sNullValue_302();
            break;
        case 303:
            ChipLogProgress(chipTool, " ***** Test Step 303 : Read attribute NULLABLE_INT64S null Value\n");
            err = TestReadAttributeNullableInt64sNullValue_303();
            break;
        case 304:
            ChipLogProgress(chipTool, " ***** Test Step 304 : Read attribute NULLABLE_INT64S null Value & range\n");
            err = TestReadAttributeNullableInt64sNullValueRange_304();
            break;
        case 305:
            ChipLogProgress(chipTool, " ***** Test Step 305 : Read attribute NULLABLE_INT64S null Value & not\n");
            err = TestReadAttributeNullableInt64sNullValueNot_305();
            break;
        case 306:
            ChipLogProgress(chipTool, " ***** Test Step 306 : Write attribute NULLABLE_INT64S Value\n");
            err = TestWriteAttributeNullableInt64sValue_306();
            break;
        case 307:
            ChipLogProgress(chipTool, " ***** Test Step 307 : Read attribute NULLABLE_INT64S Value in range\n");
            err = TestReadAttributeNullableInt64sValueInRange_307();
            break;
        case 308:
            ChipLogProgress(chipTool, " ***** Test Step 308 : Read attribute NULLABLE_INT64S notValue OK\n");
            err = TestReadAttributeNullableInt64sNotValueOk_308();
            break;
        case 309:
            ChipLogProgress(chipTool, " ***** Test Step 309 : Write attribute NULLABLE_SINGLE medium Value\n");
            err = TestWriteAttributeNullableSingleMediumValue_309();
            break;
        case 310:
            ChipLogProgress(chipTool, " ***** Test Step 310 : Read attribute NULLABLE_SINGLE medium Value\n");
            err = TestReadAttributeNullableSingleMediumValue_310();
            break;
        case 311:
            ChipLogProgress(chipTool, " ***** Test Step 311 : Write attribute NULLABLE_SINGLE largest Value\n");
            err = TestWriteAttributeNullableSingleLargestValue_311();
            break;
        case 312:
            ChipLogProgress(chipTool, " ***** Test Step 312 : Read attribute NULLABLE_SINGLE largest Value\n");
            err = TestReadAttributeNullableSingleLargestValue_312();
            break;
        case 313:
            ChipLogProgress(chipTool, " ***** Test Step 313 : Write attribute NULLABLE_SINGLE smallest Value\n");
            err = TestWriteAttributeNullableSingleSmallestValue_313();
            break;
        case 314:
            ChipLogProgress(chipTool, " ***** Test Step 314 : Read attribute NULLABLE_SINGLE smallest Value\n");
            err = TestReadAttributeNullableSingleSmallestValue_314();
            break;
        case 315:
            ChipLogProgress(chipTool, " ***** Test Step 315 : Write attribute NULLABLE_SINGLE null Value\n");
            err = TestWriteAttributeNullableSingleNullValue_315();
            break;
        case 316:
            ChipLogProgress(chipTool, " ***** Test Step 316 : Read attribute NULLABLE_SINGLE null Value\n");
            err = TestReadAttributeNullableSingleNullValue_316();
            break;
        case 317:
            ChipLogProgress(chipTool, " ***** Test Step 317 : Write attribute NULLABLE_SINGLE 0 Value\n");
            err = TestWriteAttributeNullableSingle0Value_317();
            break;
        case 318:
            ChipLogProgress(chipTool, " ***** Test Step 318 : Read attribute NULLABLE_SINGLE 0 Value\n");
            err = TestReadAttributeNullableSingle0Value_318();
            break;
        case 319:
            ChipLogProgress(chipTool, " ***** Test Step 319 : Write attribute NULLABLE_DOUBLE medium Value\n");
            err = TestWriteAttributeNullableDoubleMediumValue_319();
            break;
        case 320:
            ChipLogProgress(chipTool, " ***** Test Step 320 : Read attribute NULLABLE_DOUBLE medium Value\n");
            err = TestReadAttributeNullableDoubleMediumValue_320();
            break;
        case 321:
            ChipLogProgress(chipTool, " ***** Test Step 321 : Write attribute NULLABLE_DOUBLE largest Value\n");
            err = TestWriteAttributeNullableDoubleLargestValue_321();
            break;
        case 322:
            ChipLogProgress(chipTool, " ***** Test Step 322 : Read attribute NULLABLE_DOUBLE largest Value\n");
            err = TestReadAttributeNullableDoubleLargestValue_322();
            break;
        case 323:
            ChipLogProgress(chipTool, " ***** Test Step 323 : Write attribute NULLABLE_DOUBLE smallest Value\n");
            err = TestWriteAttributeNullableDoubleSmallestValue_323();
            break;
        case 324:
            ChipLogProgress(chipTool, " ***** Test Step 324 : Read attribute NULLABLE_DOUBLE smallest Value\n");
            err = TestReadAttributeNullableDoubleSmallestValue_324();
            break;
        case 325:
            ChipLogProgress(chipTool, " ***** Test Step 325 : Write attribute NULLABLE_DOUBLE null Value\n");
            err = TestWriteAttributeNullableDoubleNullValue_325();
            break;
        case 326:
            ChipLogProgress(chipTool, " ***** Test Step 326 : Read attribute NULLABLE_DOUBLE null Value\n");
            err = TestReadAttributeNullableDoubleNullValue_326();
            break;
        case 327:
            ChipLogProgress(chipTool, " ***** Test Step 327 : Write attribute NULLABLE_DOUBLE 0 Value\n");
            err = TestWriteAttributeNullableDouble0Value_327();
            break;
        case 328:
            ChipLogProgress(chipTool, " ***** Test Step 328 : Read attribute NULLABLE_DOUBLE 0 Value\n");
            err = TestReadAttributeNullableDouble0Value_328();
            break;
        case 329:
            ChipLogProgress(chipTool, " ***** Test Step 329 : Write attribute NULLABLE_ENUM8 Min Value\n");
            err = TestWriteAttributeNullableEnum8MinValue_329();
            break;
        case 330:
            ChipLogProgress(chipTool, " ***** Test Step 330 : Read attribute NULLABLE_ENUM8 Min Value\n");
            err = TestReadAttributeNullableEnum8MinValue_330();
            break;
        case 331:
            ChipLogProgress(chipTool, " ***** Test Step 331 : Write attribute NULLABLE_ENUM8 Max Value\n");
            err = TestWriteAttributeNullableEnum8MaxValue_331();
            break;
        case 332:
            ChipLogProgress(chipTool, " ***** Test Step 332 : Read attribute NULLABLE_ENUM8 Max Value\n");
            err = TestReadAttributeNullableEnum8MaxValue_332();
            break;
        case 333:
            ChipLogProgress(chipTool, " ***** Test Step 333 : Write attribute NULLABLE_ENUM8 Invalid Value\n");
            err = TestWriteAttributeNullableEnum8InvalidValue_333();
            break;
        case 334:
            ChipLogProgress(chipTool, " ***** Test Step 334 : Read attribute NULLABLE_ENUM8 unchanged Value\n");
            err = TestReadAttributeNullableEnum8UnchangedValue_334();
            break;
        case 335:
            ChipLogProgress(chipTool, " ***** Test Step 335 : Write attribute NULLABLE_ENUM8 null Value\n");
            err = TestWriteAttributeNullableEnum8NullValue_335();
            break;
        case 336:
            ChipLogProgress(chipTool, " ***** Test Step 336 : Read attribute NULLABLE_ENUM8 null Value\n");
            err = TestReadAttributeNullableEnum8NullValue_336();
            break;
        case 337:
            ChipLogProgress(chipTool, " ***** Test Step 337 : Write attribute NULLABLE_ENUM16 Min Value\n");
            err = TestWriteAttributeNullableEnum16MinValue_337();
            break;
        case 338:
            ChipLogProgress(chipTool, " ***** Test Step 338 : Read attribute NULLABLE_ENUM16 Min Value\n");
            err = TestReadAttributeNullableEnum16MinValue_338();
            break;
        case 339:
            ChipLogProgress(chipTool, " ***** Test Step 339 : Write attribute NULLABLE_ENUM16 Max Value\n");
            err = TestWriteAttributeNullableEnum16MaxValue_339();
            break;
        case 340:
            ChipLogProgress(chipTool, " ***** Test Step 340 : Read attribute NULLABLE_ENUM16 Max Value\n");
            err = TestReadAttributeNullableEnum16MaxValue_340();
            break;
        case 341:
            ChipLogProgress(chipTool, " ***** Test Step 341 : Write attribute NULLABLE_ENUM16 Invalid Value\n");
            err = TestWriteAttributeNullableEnum16InvalidValue_341();
            break;
        case 342:
            ChipLogProgress(chipTool, " ***** Test Step 342 : Read attribute NULLABLE_ENUM16 unchanged Value\n");
            err = TestReadAttributeNullableEnum16UnchangedValue_342();
            break;
        case 343:
            ChipLogProgress(chipTool, " ***** Test Step 343 : Write attribute NULLABLE_ENUM16 null Value\n");
            err = TestWriteAttributeNullableEnum16NullValue_343();
            break;
        case 344:
            ChipLogProgress(chipTool, " ***** Test Step 344 : Read attribute NULLABLE_ENUM16 null Value\n");
            err = TestReadAttributeNullableEnum16NullValue_344();
            break;
        case 345:
            ChipLogProgress(chipTool, " ***** Test Step 345 : Write attribute NULLABLE_SIMPLE_ENUM Min Value\n");
            err = TestWriteAttributeNullableSimpleEnumMinValue_345();
            break;
        case 346:
            ChipLogProgress(chipTool, " ***** Test Step 346 : Read attribute NULLABLE_SIMPLE_ENUM Min Value\n");
            err = TestReadAttributeNullableSimpleEnumMinValue_346();
            break;
        case 347:
            ChipLogProgress(chipTool, " ***** Test Step 347 : Write attribute NULLABLE_SIMPLE_ENUM Max Value\n");
            err = TestWriteAttributeNullableSimpleEnumMaxValue_347();
            break;
        case 348:
            ChipLogProgress(chipTool, " ***** Test Step 348 : Read attribute NULLABLE_SIMPLE_ENUM Max Value\n");
            err = TestReadAttributeNullableSimpleEnumMaxValue_348();
            break;
        case 349:
            ChipLogProgress(chipTool, " ***** Test Step 349 : Write attribute NULLABLE_SIMPLE_ENUM Invalid Value\n");
            err = TestWriteAttributeNullableSimpleEnumInvalidValue_349();
            break;
        case 350:
            ChipLogProgress(chipTool, " ***** Test Step 350 : Read attribute NULLABLE_SIMPLE_ENUM unchanged Value\n");
            err = TestReadAttributeNullableSimpleEnumUnchangedValue_350();
            break;
        case 351:
            ChipLogProgress(chipTool, " ***** Test Step 351 : Write attribute NULLABLE_SIMPLE_ENUM null Value\n");
            err = TestWriteAttributeNullableSimpleEnumNullValue_351();
            break;
        case 352:
            ChipLogProgress(chipTool, " ***** Test Step 352 : Read attribute NULLABLE_SIMPLE_ENUM null Value\n");
            err = TestReadAttributeNullableSimpleEnumNullValue_352();
            break;
        case 353:
            ChipLogProgress(chipTool, " ***** Test Step 353 : Read attribute NULLABLE_SIMPLE_ENUM not 3 Value\n");
            err = TestReadAttributeNullableSimpleEnumNot3Value_353();
            break;
        case 354:
            ChipLogProgress(chipTool, " ***** Test Step 354 : Read attribute NULLABLE_OCTET_STRING Default Value\n");
            err = TestReadAttributeNullableOctetStringDefaultValue_354();
            break;
        case 355:
            ChipLogProgress(chipTool, " ***** Test Step 355 : Write attribute NULLABLE_OCTET_STRING\n");
            err = TestWriteAttributeNullableOctetString_355();
            break;
        case 356:
            ChipLogProgress(chipTool, " ***** Test Step 356 : Read attribute NULLABLE_OCTET_STRING\n");
            err = TestReadAttributeNullableOctetString_356();
            break;
        case 357:
            ChipLogProgress(chipTool, " ***** Test Step 357 : Write attribute NULLABLE_OCTET_STRING\n");
            err = TestWriteAttributeNullableOctetString_357();
            break;
        case 358:
            ChipLogProgress(chipTool, " ***** Test Step 358 : Read attribute NULLABLE_OCTET_STRING\n");
            err = TestReadAttributeNullableOctetString_358();
            break;
        case 359:
            ChipLogProgress(chipTool, " ***** Test Step 359 : Write attribute NULLABLE_OCTET_STRING\n");
            err = TestWriteAttributeNullableOctetString_359();
            break;
        case 360:
            ChipLogProgress(chipTool, " ***** Test Step 360 : Read attribute NULLABLE_OCTET_STRING\n");
            err = TestReadAttributeNullableOctetString_360();
            break;
        case 361:
            ChipLogProgress(chipTool, " ***** Test Step 361 : Read attribute NULLABLE_OCTET_STRING not TestValue\n");
            err = TestReadAttributeNullableOctetStringNotTestValue_361();
            break;
        case 362:
            ChipLogProgress(chipTool, " ***** Test Step 362 : Read attribute NULLABLE_CHAR_STRING Default Value\n");
            err = TestReadAttributeNullableCharStringDefaultValue_362();
            break;
        case 363:
            ChipLogProgress(chipTool, " ***** Test Step 363 : Write attribute NULLABLE_CHAR_STRING\n");
            err = TestWriteAttributeNullableCharString_363();
            break;
        case 364:
            ChipLogProgress(chipTool, " ***** Test Step 364 : Read attribute NULLABLE_CHAR_STRING\n");
            err = TestReadAttributeNullableCharString_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 : Write attribute NULLABLE_CHAR_STRING - Value too long\n");
            err = TestWriteAttributeNullableCharStringValueTooLong_366();
            break;
        case 367:
            ChipLogProgress(chipTool, " ***** Test Step 367 : Read attribute NULLABLE_CHAR_STRING\n");
            err = TestReadAttributeNullableCharString_367();
            break;
        case 368:
            ChipLogProgress(chipTool, " ***** Test Step 368 : Write attribute NULLABLE_CHAR_STRING - Empty\n");
            err = TestWriteAttributeNullableCharStringEmpty_368();
            break;
        case 369:
            ChipLogProgress(chipTool, " ***** Test Step 369 : Read attribute NULLABLE_CHAR_STRING\n");
            err = TestReadAttributeNullableCharString_369();
            break;
        case 370:
            ChipLogProgress(chipTool, " ***** Test Step 370 : Read attribute NULLABLE_CHAR_STRING not ☉T☉\n");
            err = TestReadAttributeNullableCharStringNott_370();
            break;
        case 371:
            ChipLogProgress(chipTool, " ***** Test Step 371 : Read attribute from nonexistent endpoint.\n");
            err = TestReadAttributeFromNonexistentEndpoint_371();
            break;
        case 372:
            ChipLogProgress(chipTool, " ***** Test Step 372 : Read attribute from nonexistent cluster.\n");
            err = TestReadAttributeFromNonexistentCluster_372();
            break;
        case 373:
            ChipLogProgress(
                chipTool, " ***** Test Step 373 : Send a command that takes an optional parameter but do not set it.\n");
            err = TestSendACommandThatTakesAnOptionalParameterButDoNotSetIt_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 : Report: Subscribe to list attribute\n");
            err = TestReportSubscribeToListAttribute_375();
            break;
        case 376:
            ChipLogProgress(chipTool, " ***** Test Step 376 : Subscribe to list attribute\n");
            err = TestSubscribeToListAttribute_376();
            break;
        case 377:
            ChipLogProgress(chipTool, " ***** Test Step 377 : Write subscribed-to list attribute\n");
            err = TestWriteSubscribedToListAttribute_377();
            break;
        case 378:
            ChipLogProgress(chipTool, " ***** Test Step 378 : Check for list attribute report\n");
            err = TestCheckForListAttributeReport_378();
            break;
        case 379:
            ChipLogProgress(chipTool, " ***** Test Step 379 : Read range-restricted unsigned 8-bit integer\n");
            err = TestReadRangeRestrictedUnsigned8BitInteger_379();
            break;
        case 380:
            ChipLogProgress(chipTool, " ***** Test Step 380 : Write min value to a range-restricted unsigned 8-bit integer\n");
            err = TestWriteMinValueToARangeRestrictedUnsigned8BitInteger_380();
            break;
        case 381:
            ChipLogProgress(
                chipTool, " ***** Test Step 381 : Write just-below-range value to a range-restricted unsigned 8-bit integer\n");
            err = TestWriteJustBelowRangeValueToARangeRestrictedUnsigned8BitInteger_381();
            break;
        case 382:
            ChipLogProgress(
                chipTool, " ***** Test Step 382 : Write just-above-range value to a range-restricted unsigned 8-bit integer\n");
            err = TestWriteJustAboveRangeValueToARangeRestrictedUnsigned8BitInteger_382();
            break;
        case 383:
            ChipLogProgress(chipTool, " ***** Test Step 383 : Write max value to a range-restricted unsigned 8-bit integer\n");
            err = TestWriteMaxValueToARangeRestrictedUnsigned8BitInteger_383();
            break;
        case 384:
            ChipLogProgress(
                chipTool, " ***** Test Step 384 : Verify range-restricted unsigned 8-bit integer value has not changed\n");
            err = TestVerifyRangeRestrictedUnsigned8BitIntegerValueHasNotChanged_384();
            break;
        case 385:
            ChipLogProgress(
                chipTool, " ***** Test Step 385 : Write min valid value to a range-restricted unsigned 8-bit integer\n");
            err = TestWriteMinValidValueToARangeRestrictedUnsigned8BitInteger_385();
            break;
        case 386:
            ChipLogProgress(
                chipTool, " ***** Test Step 386 : Verify range-restricted unsigned 8-bit integer value is at min valid\n");
            err = TestVerifyRangeRestrictedUnsigned8BitIntegerValueIsAtMinValid_386();
            break;
        case 387:
            ChipLogProgress(
                chipTool, " ***** Test Step 387 : Write max valid value to a range-restricted unsigned 8-bit integer\n");
            err = TestWriteMaxValidValueToARangeRestrictedUnsigned8BitInteger_387();
            break;
        case 388:
            ChipLogProgress(
                chipTool, " ***** Test Step 388 : Verify range-restricted unsigned 8-bit integer value is at max valid\n");
            err = TestVerifyRangeRestrictedUnsigned8BitIntegerValueIsAtMaxValid_388();
            break;
        case 389:
            ChipLogProgress(
                chipTool, " ***** Test Step 389 : Write middle valid value to a range-restricted unsigned 8-bit integer\n");
            err = TestWriteMiddleValidValueToARangeRestrictedUnsigned8BitInteger_389();
            break;
        case 390:
            ChipLogProgress(
                chipTool, " ***** Test Step 390 : Verify range-restricted unsigned 8-bit integer value is at mid valid\n");
            err = TestVerifyRangeRestrictedUnsigned8BitIntegerValueIsAtMidValid_390();
            break;
        case 391:
            ChipLogProgress(chipTool, " ***** Test Step 391 : Read range-restricted unsigned 16-bit integer\n");
            err = TestReadRangeRestrictedUnsigned16BitInteger_391();
            break;
        case 392:
            ChipLogProgress(chipTool, " ***** Test Step 392 : Write min value to a range-restricted unsigned 16-bit integer\n");
            err = TestWriteMinValueToARangeRestrictedUnsigned16BitInteger_392();
            break;
        case 393:
            ChipLogProgress(
                chipTool, " ***** Test Step 393 : Write just-below-range value to a range-restricted unsigned 16-bit integer\n");
            err = TestWriteJustBelowRangeValueToARangeRestrictedUnsigned16BitInteger_393();
            break;
        case 394:
            ChipLogProgress(
                chipTool, " ***** Test Step 394 : Write just-above-range value to a range-restricted unsigned 16-bit integer\n");
            err = TestWriteJustAboveRangeValueToARangeRestrictedUnsigned16BitInteger_394();
            break;
        case 395:
            ChipLogProgress(chipTool, " ***** Test Step 395 : Write max value to a range-restricted unsigned 16-bit integer\n");
            err = TestWriteMaxValueToARangeRestrictedUnsigned16BitInteger_395();
            break;
        case 396:
            ChipLogProgress(
                chipTool, " ***** Test Step 396 : Verify range-restricted unsigned 16-bit integer value has not changed\n");
            err = TestVerifyRangeRestrictedUnsigned16BitIntegerValueHasNotChanged_396();
            break;
        case 397:
            ChipLogProgress(
                chipTool, " ***** Test Step 397 : Write min valid value to a range-restricted unsigned 16-bit integer\n");
            err = TestWriteMinValidValueToARangeRestrictedUnsigned16BitInteger_397();
            break;
        case 398:
            ChipLogProgress(
                chipTool, " ***** Test Step 398 : Verify range-restricted unsigned 16-bit integer value is at min valid\n");
            err = TestVerifyRangeRestrictedUnsigned16BitIntegerValueIsAtMinValid_398();
            break;
        case 399:
            ChipLogProgress(
                chipTool, " ***** Test Step 399 : Write max valid value to a range-restricted unsigned 16-bit integer\n");
            err = TestWriteMaxValidValueToARangeRestrictedUnsigned16BitInteger_399();
            break;
        case 400:
            ChipLogProgress(
                chipTool, " ***** Test Step 400 : Verify range-restricted unsigned 16-bit integer value is at max valid\n");
            err = TestVerifyRangeRestrictedUnsigned16BitIntegerValueIsAtMaxValid_400();
            break;
        case 401:
            ChipLogProgress(
                chipTool, " ***** Test Step 401 : Write middle valid value to a range-restricted unsigned 16-bit integer\n");
            err = TestWriteMiddleValidValueToARangeRestrictedUnsigned16BitInteger_401();
            break;
        case 402:
            ChipLogProgress(
                chipTool, " ***** Test Step 402 : Verify range-restricted unsigned 16-bit integer value is at mid valid\n");
            err = TestVerifyRangeRestrictedUnsigned16BitIntegerValueIsAtMidValid_402();
            break;
        case 403:
            ChipLogProgress(chipTool, " ***** Test Step 403 : Read range-restricted signed 8-bit integer\n");
            err = TestReadRangeRestrictedSigned8BitInteger_403();
            break;
        case 404:
            ChipLogProgress(chipTool, " ***** Test Step 404 : Write min value to a range-restricted signed 8-bit integer\n");
            err = TestWriteMinValueToARangeRestrictedSigned8BitInteger_404();
            break;
        case 405:
            ChipLogProgress(
                chipTool, " ***** Test Step 405 : Write just-below-range value to a range-restricted signed 8-bit integer\n");
            err = TestWriteJustBelowRangeValueToARangeRestrictedSigned8BitInteger_405();
            break;
        case 406:
            ChipLogProgress(
                chipTool, " ***** Test Step 406 : Write just-above-range value to a range-restricted signed 8-bit integer\n");
            err = TestWriteJustAboveRangeValueToARangeRestrictedSigned8BitInteger_406();
            break;
        case 407:
            ChipLogProgress(chipTool, " ***** Test Step 407 : Write max value to a range-restricted signed 8-bit integer\n");
            err = TestWriteMaxValueToARangeRestrictedSigned8BitInteger_407();
            break;
        case 408:
            ChipLogProgress(
                chipTool, " ***** Test Step 408 : Verify range-restricted signed 8-bit integer value has not changed\n");
            err = TestVerifyRangeRestrictedSigned8BitIntegerValueHasNotChanged_408();
            break;
        case 409:
            ChipLogProgress(chipTool, " ***** Test Step 409 : Write min valid value to a range-restricted signed 8-bit integer\n");
            err = TestWriteMinValidValueToARangeRestrictedSigned8BitInteger_409();
            break;
        case 410:
            ChipLogProgress(
                chipTool, " ***** Test Step 410 : Verify range-restricted signed 8-bit integer value is at min valid\n");
            err = TestVerifyRangeRestrictedSigned8BitIntegerValueIsAtMinValid_410();
            break;
        case 411:
            ChipLogProgress(chipTool, " ***** Test Step 411 : Write max valid value to a range-restricted signed 8-bit integer\n");
            err = TestWriteMaxValidValueToARangeRestrictedSigned8BitInteger_411();
            break;
        case 412:
            ChipLogProgress(
                chipTool, " ***** Test Step 412 : Verify range-restricted signed 8-bit integer value is at max valid\n");
            err = TestVerifyRangeRestrictedSigned8BitIntegerValueIsAtMaxValid_412();
            break;
        case 413:
            ChipLogProgress(
                chipTool, " ***** Test Step 413 : Write middle valid value to a range-restricted signed 8-bit integer\n");
            err = TestWriteMiddleValidValueToARangeRestrictedSigned8BitInteger_413();
            break;
        case 414:
            ChipLogProgress(
                chipTool, " ***** Test Step 414 : Verify range-restricted signed 8-bit integer value is at mid valid\n");
            err = TestVerifyRangeRestrictedSigned8BitIntegerValueIsAtMidValid_414();
            break;
        case 415:
            ChipLogProgress(chipTool, " ***** Test Step 415 : Read range-restricted signed 16-bit integer\n");
            err = TestReadRangeRestrictedSigned16BitInteger_415();
            break;
        case 416:
            ChipLogProgress(chipTool, " ***** Test Step 416 : Write min value to a range-restricted signed 16-bit integer\n");
            err = TestWriteMinValueToARangeRestrictedSigned16BitInteger_416();
            break;
        case 417:
            ChipLogProgress(
                chipTool, " ***** Test Step 417 : Write just-below-range value to a range-restricted signed 16-bit integer\n");
            err = TestWriteJustBelowRangeValueToARangeRestrictedSigned16BitInteger_417();
            break;
        case 418:
            ChipLogProgress(
                chipTool, " ***** Test Step 418 : Write just-above-range value to a range-restricted signed 16-bit integer\n");
            err = TestWriteJustAboveRangeValueToARangeRestrictedSigned16BitInteger_418();
            break;
        case 419:
            ChipLogProgress(chipTool, " ***** Test Step 419 : Write max value to a range-restricted signed 16-bit integer\n");
            err = TestWriteMaxValueToARangeRestrictedSigned16BitInteger_419();
            break;
        case 420:
            ChipLogProgress(
                chipTool, " ***** Test Step 420 : Verify range-restricted signed 16-bit integer value has not changed\n");
            err = TestVerifyRangeRestrictedSigned16BitIntegerValueHasNotChanged_420();
            break;
        case 421:
            ChipLogProgress(chipTool, " ***** Test Step 421 : Write min valid value to a range-restricted signed 16-bit integer\n");
            err = TestWriteMinValidValueToARangeRestrictedSigned16BitInteger_421();
            break;
        case 422:
            ChipLogProgress(
                chipTool, " ***** Test Step 422 : Verify range-restricted signed 16-bit integer value is at min valid\n");
            err = TestVerifyRangeRestrictedSigned16BitIntegerValueIsAtMinValid_422();
            break;
        case 423:
            ChipLogProgress(chipTool, " ***** Test Step 423 : Write max valid value to a range-restricted signed 16-bit integer\n");
            err = TestWriteMaxValidValueToARangeRestrictedSigned16BitInteger_423();
            break;
        case 424:
            ChipLogProgress(
                chipTool, " ***** Test Step 424 : Verify range-restricted signed 16-bit integer value is at max valid\n");
            err = TestVerifyRangeRestrictedSigned16BitIntegerValueIsAtMaxValid_424();
            break;
        case 425:
            ChipLogProgress(
                chipTool, " ***** Test Step 425 : Write middle valid value to a range-restricted signed 16-bit integer\n");
            err = TestWriteMiddleValidValueToARangeRestrictedSigned16BitInteger_425();
            break;
        case 426:
            ChipLogProgress(
                chipTool, " ***** Test Step 426 : Verify range-restricted signed 16-bit integer value is at mid valid\n");
            err = TestVerifyRangeRestrictedSigned16BitIntegerValueIsAtMidValid_426();
            break;
        case 427:
            ChipLogProgress(chipTool, " ***** Test Step 427 : Read nullable range-restricted unsigned 8-bit integer\n");
            err = TestReadNullableRangeRestrictedUnsigned8BitInteger_427();
            break;
        case 428:
            ChipLogProgress(
                chipTool, " ***** Test Step 428 : Write min value to a nullable range-restricted unsigned 8-bit integer\n");
            err = TestWriteMinValueToANullableRangeRestrictedUnsigned8BitInteger_428();
            break;
        case 429:
            ChipLogProgress(chipTool,
                " ***** Test Step 429 : Write just-below-range value to a nullable range-restricted unsigned 8-bit integer\n");
            err = TestWriteJustBelowRangeValueToANullableRangeRestrictedUnsigned8BitInteger_429();
            break;
        case 430:
            ChipLogProgress(chipTool,
                " ***** Test Step 430 : Write just-above-range value to a nullable range-restricted unsigned 8-bit integer\n");
            err = TestWriteJustAboveRangeValueToANullableRangeRestrictedUnsigned8BitInteger_430();
            break;
        case 431:
            ChipLogProgress(
                chipTool, " ***** Test Step 431 : Write max value to a nullable range-restricted unsigned 8-bit integer\n");
            err = TestWriteMaxValueToANullableRangeRestrictedUnsigned8BitInteger_431();
            break;
        case 432:
            ChipLogProgress(
                chipTool, " ***** Test Step 432 : Verify nullable range-restricted unsigned 8-bit integer value has not changed\n");
            err = TestVerifyNullableRangeRestrictedUnsigned8BitIntegerValueHasNotChanged_432();
            break;
        case 433:
            ChipLogProgress(
                chipTool, " ***** Test Step 433 : Write min valid value to a nullable range-restricted unsigned 8-bit integer\n");
            err = TestWriteMinValidValueToANullableRangeRestrictedUnsigned8BitInteger_433();
            break;
        case 434:
            ChipLogProgress(
                chipTool, " ***** Test Step 434 : Verify nullable range-restricted unsigned 8-bit integer value is at min valid\n");
            err = TestVerifyNullableRangeRestrictedUnsigned8BitIntegerValueIsAtMinValid_434();
            break;
        case 435:
            ChipLogProgress(
                chipTool, " ***** Test Step 435 : Write max valid value to a nullable range-restricted unsigned 8-bit integer\n");
            err = TestWriteMaxValidValueToANullableRangeRestrictedUnsigned8BitInteger_435();
            break;
        case 436:
            ChipLogProgress(
                chipTool, " ***** Test Step 436 : Verify nullable range-restricted unsigned 8-bit integer value is at max valid\n");
            err = TestVerifyNullableRangeRestrictedUnsigned8BitIntegerValueIsAtMaxValid_436();
            break;
        case 437:
            ChipLogProgress(chipTool,
                " ***** Test Step 437 : Write middle valid value to a nullable range-restricted unsigned 8-bit integer\n");
            err = TestWriteMiddleValidValueToANullableRangeRestrictedUnsigned8BitInteger_437();
            break;
        case 438:
            ChipLogProgress(
                chipTool, " ***** Test Step 438 : Verify nullable range-restricted unsigned 8-bit integer value is at mid valid\n");
            err = TestVerifyNullableRangeRestrictedUnsigned8BitIntegerValueIsAtMidValid_438();
            break;
        case 439:
            ChipLogProgress(
                chipTool, " ***** Test Step 439 : Write null value to a nullable range-restricted unsigned 8-bit integer\n");
            err = TestWriteNullValueToANullableRangeRestrictedUnsigned8BitInteger_439();
            break;
        case 440:
            ChipLogProgress(
                chipTool, " ***** Test Step 440 : Verify nullable range-restricted unsigned 8-bit integer value is null\n");
            err = TestVerifyNullableRangeRestrictedUnsigned8BitIntegerValueIsNull_440();
            break;
        case 441:
            ChipLogProgress(chipTool, " ***** Test Step 441 : Read nullable range-restricted unsigned 16-bit integer\n");
            err = TestReadNullableRangeRestrictedUnsigned16BitInteger_441();
            break;
        case 442:
            ChipLogProgress(
                chipTool, " ***** Test Step 442 : Write min value to a nullable range-restricted unsigned 16-bit integer\n");
            err = TestWriteMinValueToANullableRangeRestrictedUnsigned16BitInteger_442();
            break;
        case 443:
            ChipLogProgress(chipTool,
                " ***** Test Step 443 : Write just-below-range value to a nullable range-restricted unsigned 16-bit integer\n");
            err = TestWriteJustBelowRangeValueToANullableRangeRestrictedUnsigned16BitInteger_443();
            break;
        case 444:
            ChipLogProgress(chipTool,
                " ***** Test Step 444 : Write just-above-range value to a nullable range-restricted unsigned 16-bit integer\n");
            err = TestWriteJustAboveRangeValueToANullableRangeRestrictedUnsigned16BitInteger_444();
            break;
        case 445:
            ChipLogProgress(
                chipTool, " ***** Test Step 445 : Write max value to a nullable range-restricted unsigned 16-bit integer\n");
            err = TestWriteMaxValueToANullableRangeRestrictedUnsigned16BitInteger_445();
            break;
        case 446:
            ChipLogProgress(chipTool,
                " ***** Test Step 446 : Verify nullable range-restricted unsigned 16-bit integer value has not changed\n");
            err = TestVerifyNullableRangeRestrictedUnsigned16BitIntegerValueHasNotChanged_446();
            break;
        case 447:
            ChipLogProgress(
                chipTool, " ***** Test Step 447 : Write min valid value to a nullable range-restricted unsigned 16-bit integer\n");
            err = TestWriteMinValidValueToANullableRangeRestrictedUnsigned16BitInteger_447();
            break;
        case 448:
            ChipLogProgress(chipTool,
                " ***** Test Step 448 : Verify nullable range-restricted unsigned 16-bit integer value is at min valid\n");
            err = TestVerifyNullableRangeRestrictedUnsigned16BitIntegerValueIsAtMinValid_448();
            break;
        case 449:
            ChipLogProgress(
                chipTool, " ***** Test Step 449 : Write max valid value to a nullable range-restricted unsigned 16-bit integer\n");
            err = TestWriteMaxValidValueToANullableRangeRestrictedUnsigned16BitInteger_449();
            break;
        case 450:
            ChipLogProgress(chipTool,
                " ***** Test Step 450 : Verify nullable range-restricted unsigned 16-bit integer value is at max valid\n");
            err = TestVerifyNullableRangeRestrictedUnsigned16BitIntegerValueIsAtMaxValid_450();
            break;
        case 451:
            ChipLogProgress(chipTool,
                " ***** Test Step 451 : Write middle valid value to a nullable range-restricted unsigned 16-bit integer\n");
            err = TestWriteMiddleValidValueToANullableRangeRestrictedUnsigned16BitInteger_451();
            break;
        case 452:
            ChipLogProgress(chipTool,
                " ***** Test Step 452 : Verify nullable range-restricted unsigned 16-bit integer value is at mid valid\n");
            err = TestVerifyNullableRangeRestrictedUnsigned16BitIntegerValueIsAtMidValid_452();
            break;
        case 453:
            ChipLogProgress(
                chipTool, " ***** Test Step 453 : Write null value to a nullable range-restricted unsigned 16-bit integer\n");
            err = TestWriteNullValueToANullableRangeRestrictedUnsigned16BitInteger_453();
            break;
        case 454:
            ChipLogProgress(
                chipTool, " ***** Test Step 454 : Verify nullable range-restricted unsigned 16-bit integer value is null\n");
            err = TestVerifyNullableRangeRestrictedUnsigned16BitIntegerValueIsNull_454();
            break;
        case 455:
            ChipLogProgress(chipTool, " ***** Test Step 455 : Read nullable range-restricted signed 8-bit integer\n");
            err = TestReadNullableRangeRestrictedSigned8BitInteger_455();
            break;
        case 456:
            ChipLogProgress(
                chipTool, " ***** Test Step 456 : Write min value to a nullable range-restricted signed 8-bit integer\n");
            err = TestWriteMinValueToANullableRangeRestrictedSigned8BitInteger_456();
            break;
        case 457:
            ChipLogProgress(chipTool,
                " ***** Test Step 457 : Write just-below-range value to a nullable range-restricted signed 8-bit integer\n");
            err = TestWriteJustBelowRangeValueToANullableRangeRestrictedSigned8BitInteger_457();
            break;
        case 458:
            ChipLogProgress(chipTool,
                " ***** Test Step 458 : Write just-above-range value to a nullable range-restricted signed 8-bit integer\n");
            err = TestWriteJustAboveRangeValueToANullableRangeRestrictedSigned8BitInteger_458();
            break;
        case 459:
            ChipLogProgress(
                chipTool, " ***** Test Step 459 : Write max value to a nullable range-restricted signed 8-bit integer\n");
            err = TestWriteMaxValueToANullableRangeRestrictedSigned8BitInteger_459();
            break;
        case 460:
            ChipLogProgress(
                chipTool, " ***** Test Step 460 : Verify nullable range-restricted signed 8-bit integer value has not changed\n");
            err = TestVerifyNullableRangeRestrictedSigned8BitIntegerValueHasNotChanged_460();
            break;
        case 461:
            ChipLogProgress(
                chipTool, " ***** Test Step 461 : Write min valid value to a nullable range-restricted signed 8-bit integer\n");
            err = TestWriteMinValidValueToANullableRangeRestrictedSigned8BitInteger_461();
            break;
        case 462:
            ChipLogProgress(
                chipTool, " ***** Test Step 462 : Verify nullable range-restricted signed 8-bit integer value is at min valid\n");
            err = TestVerifyNullableRangeRestrictedSigned8BitIntegerValueIsAtMinValid_462();
            break;
        case 463:
            ChipLogProgress(
                chipTool, " ***** Test Step 463 : Write max valid value to a nullable range-restricted signed 8-bit integer\n");
            err = TestWriteMaxValidValueToANullableRangeRestrictedSigned8BitInteger_463();
            break;
        case 464:
            ChipLogProgress(
                chipTool, " ***** Test Step 464 : Verify nullable range-restricted signed 8-bit integer value is at max valid\n");
            err = TestVerifyNullableRangeRestrictedSigned8BitIntegerValueIsAtMaxValid_464();
            break;
        case 465:
            ChipLogProgress(
                chipTool, " ***** Test Step 465 : Write middle valid value to a nullable range-restricted signed 8-bit integer\n");
            err = TestWriteMiddleValidValueToANullableRangeRestrictedSigned8BitInteger_465();
            break;
        case 466:
            ChipLogProgress(
                chipTool, " ***** Test Step 466 : Verify nullable range-restricted signed 8-bit integer value is at mid valid\n");
            err = TestVerifyNullableRangeRestrictedSigned8BitIntegerValueIsAtMidValid_466();
            break;
        case 467:
            ChipLogProgress(
                chipTool, " ***** Test Step 467 : Write null value to a nullable range-restricted signed 8-bit integer\n");
            err = TestWriteNullValueToANullableRangeRestrictedSigned8BitInteger_467();
            break;
        case 468:
            ChipLogProgress(
                chipTool, " ***** Test Step 468 : Verify nullable range-restricted signed 8-bit integer value is at null\n");
            err = TestVerifyNullableRangeRestrictedSigned8BitIntegerValueIsAtNull_468();
            break;
        case 469:
            ChipLogProgress(chipTool, " ***** Test Step 469 : Read nullable range-restricted signed 16-bit integer\n");
            err = TestReadNullableRangeRestrictedSigned16BitInteger_469();
            break;
        case 470:
            ChipLogProgress(
                chipTool, " ***** Test Step 470 : Write min value to a nullable range-restricted signed 16-bit integer\n");
            err = TestWriteMinValueToANullableRangeRestrictedSigned16BitInteger_470();
            break;
        case 471:
            ChipLogProgress(chipTool,
                " ***** Test Step 471 : Write just-below-range value to a nullable range-restricted signed 16-bit integer\n");
            err = TestWriteJustBelowRangeValueToANullableRangeRestrictedSigned16BitInteger_471();
            break;
        case 472:
            ChipLogProgress(chipTool,
                " ***** Test Step 472 : Write just-above-range value to a nullable range-restricted signed 16-bit integer\n");
            err = TestWriteJustAboveRangeValueToANullableRangeRestrictedSigned16BitInteger_472();
            break;
        case 473:
            ChipLogProgress(
                chipTool, " ***** Test Step 473 : Write max value to a nullable range-restricted signed 16-bit integer\n");
            err = TestWriteMaxValueToANullableRangeRestrictedSigned16BitInteger_473();
            break;
        case 474:
            ChipLogProgress(
                chipTool, " ***** Test Step 474 : Verify nullable range-restricted signed 16-bit integer value has not changed\n");
            err = TestVerifyNullableRangeRestrictedSigned16BitIntegerValueHasNotChanged_474();
            break;
        case 475:
            ChipLogProgress(
                chipTool, " ***** Test Step 475 : Write min valid value to a nullable range-restricted signed 16-bit integer\n");
            err = TestWriteMinValidValueToANullableRangeRestrictedSigned16BitInteger_475();
            break;
        case 476:
            ChipLogProgress(
                chipTool, " ***** Test Step 476 : Verify nullable range-restricted signed 16-bit integer value is at min valid\n");
            err = TestVerifyNullableRangeRestrictedSigned16BitIntegerValueIsAtMinValid_476();
            break;
        case 477:
            ChipLogProgress(
                chipTool, " ***** Test Step 477 : Write max valid value to a nullable range-restricted signed 16-bit integer\n");
            err = TestWriteMaxValidValueToANullableRangeRestrictedSigned16BitInteger_477();
            break;
        case 478:
            ChipLogProgress(
                chipTool, " ***** Test Step 478 : Verify nullable range-restricted signed 16-bit integer value is at max valid\n");
            err = TestVerifyNullableRangeRestrictedSigned16BitIntegerValueIsAtMaxValid_478();
            break;
        case 479:
            ChipLogProgress(
                chipTool, " ***** Test Step 479 : Write middle valid value to a nullable range-restricted signed 16-bit integer\n");
            err = TestWriteMiddleValidValueToANullableRangeRestrictedSigned16BitInteger_479();
            break;
        case 480:
            ChipLogProgress(
                chipTool, " ***** Test Step 480 : Verify nullable range-restricted signed 16-bit integer value is at mid valid\n");
            err = TestVerifyNullableRangeRestrictedSigned16BitIntegerValueIsAtMidValid_480();
            break;
        case 481:
            ChipLogProgress(
                chipTool, " ***** Test Step 481 : Write null value to a nullable range-restricted signed 16-bit integer\n");
            err = TestWriteNullValueToANullableRangeRestrictedSigned16BitInteger_481();
            break;
        case 482:
            ChipLogProgress(
                chipTool, " ***** Test Step 482 : Verify nullable range-restricted signed 16-bit integer value is null\n");
            err = TestVerifyNullableRangeRestrictedSigned16BitIntegerValueIsNull_482();
            break;
        case 483:
            ChipLogProgress(chipTool, " ***** Test Step 483 : Write attribute that returns general status on write\n");
            err = TestWriteAttributeThatReturnsGeneralStatusOnWrite_483();
            break;
        case 484:
            ChipLogProgress(chipTool, " ***** Test Step 484 : Write attribute that returns cluster-specific status on write\n");
            err = TestWriteAttributeThatReturnsClusterSpecificStatusOnWrite_484();
            break;
        case 485:
            ChipLogProgress(chipTool, " ***** Test Step 485 : Read attribute that returns general status on read\n");
            err = TestReadAttributeThatReturnsGeneralStatusOnRead_485();
            break;
        case 486:
            ChipLogProgress(chipTool, " ***** Test Step 486 : read attribute that returns cluster-specific status on read\n");
            err = TestReadAttributeThatReturnsClusterSpecificStatusOnRead_486();
            break;
        case 487:
            ChipLogProgress(chipTool, " ***** Test Step 487 : read AcceptedCommandList attribute\n");
            err = TestReadAcceptedCommandListAttribute_487();
            break;
        case 488:
            ChipLogProgress(chipTool, " ***** Test Step 488 : read GeneratedCommandList attribute\n");
            err = TestReadGeneratedCommandListAttribute_488();
            break;
        case 489:
            ChipLogProgress(chipTool, " ***** Test Step 489 : Write struct-typed attribute\n");
            err = TestWriteStructTypedAttribute_489();
            break;
        case 490:
            ChipLogProgress(chipTool, " ***** Test Step 490 : Read struct-typed attribute\n");
            err = TestReadStructTypedAttribute_490();
            break;
        }

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

    void OnStatusUpdate(const chip::app::StatusIB & status) override
    {
        switch (mTestIndex - 1) {
        case 0:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 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), EMBER_ZCL_STATUS_UNSUPPORTED_ENDPOINT));
            break;
        case 149:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_CLUSTER));
            break;
        case 150:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 190:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 197:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 203:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 209:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 217:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 231:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 244:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 257:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 268:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 279:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 290:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 301:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 334:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 342:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 350:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), EMBER_ZCL_STATUS_UNSUPPORTED_ENDPOINT));
            break;
        case 372:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_CLUSTER));
            break;
        case 373:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_VALUE));
            break;
        case 374:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 375:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 381:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 382:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 383:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 384:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 393:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 394:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 395:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 396:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 405:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 406:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 407:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 408:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 417:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 418:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 419:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 420:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 429:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 430:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 431:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 432:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 443:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 444:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 445:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 446:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 457:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 458:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 459:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 460:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 471:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 472:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 473:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 474:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), EMBER_ZCL_STATUS_INVALID_DATA_TYPE));
            break;
        case 484:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 485:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_DATA_TYPE));
            break;
        case 486:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 487:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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;
        }

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

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

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

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

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

        [cluster testWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster testNotHandledWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster testSpecificWithCompletionHandler:^(
            MTRTestClusterClusterTestSpecificResponseParams * _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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRTestClusterClusterTestAddArgumentsParams alloc] init];
        params.arg1 = [NSNumber numberWithUnsignedChar:3U];
        params.arg2 = [NSNumber numberWithUnsignedChar:17U];
        [cluster testAddArgumentsWithParams:params
                          completionHandler:^(
                              MTRTestClusterClusterTestAddArgumentsResponseParams * _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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRTestClusterClusterTestAddArgumentsParams alloc] init];
        params.arg1 = [NSNumber numberWithUnsignedChar:250U];
        params.arg2 = [NSNumber numberWithUnsignedChar:6U];
        [cluster
            testAddArgumentsWithParams:params
                     completionHandler:^(
                         MTRTestClusterClusterTestAddArgumentsResponseParams * _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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBooleanWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id booleanArgument;
        booleanArgument = [NSNumber numberWithBool:1];
        [cluster writeAttributeBooleanWithValue:booleanArgument
                              completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBooleanWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id booleanArgument;
        booleanArgument = [NSNumber numberWithBool:0];
        [cluster writeAttributeBooleanWithValue:booleanArgument
                              completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBooleanWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap8WithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap8Argument;
        bitmap8Argument = [NSNumber numberWithUnsignedChar:255U];
        [cluster writeAttributeBitmap8WithValue:bitmap8Argument
                              completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap8WithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap8Argument;
        bitmap8Argument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeBitmap8WithValue:bitmap8Argument
                              completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap8WithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap16WithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap16Argument;
        bitmap16Argument = [NSNumber numberWithUnsignedShort:65535U];
        [cluster writeAttributeBitmap16WithValue:bitmap16Argument
                               completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap16WithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap16Argument;
        bitmap16Argument = [NSNumber numberWithUnsignedShort:0U];
        [cluster writeAttributeBitmap16WithValue:bitmap16Argument
                               completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap16WithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap32WithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap32Argument;
        bitmap32Argument = [NSNumber numberWithUnsignedInt:4294967295UL];
        [cluster writeAttributeBitmap32WithValue:bitmap32Argument
                               completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap32WithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap32Argument;
        bitmap32Argument = [NSNumber numberWithUnsignedInt:0UL];
        [cluster writeAttributeBitmap32WithValue:bitmap32Argument
                               completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap32WithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap64WithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap64Argument;
        bitmap64Argument = [NSNumber numberWithUnsignedLongLong:18446744073709551615ULL];
        [cluster writeAttributeBitmap64WithValue:bitmap64Argument
                               completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap64WithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap64Argument;
        bitmap64Argument = [NSNumber numberWithUnsignedLongLong:0ULL];
        [cluster writeAttributeBitmap64WithValue:bitmap64Argument
                               completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap64WithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt8uWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int8uArgument;
        int8uArgument = [NSNumber numberWithUnsignedChar:255U];
        [cluster writeAttributeInt8uWithValue:int8uArgument
                            completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt8uWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int8uArgument;
        int8uArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeInt8uWithValue:int8uArgument
                            completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt8uWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt16uWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int16uArgument;
        int16uArgument = [NSNumber numberWithUnsignedShort:65535U];
        [cluster writeAttributeInt16uWithValue:int16uArgument
                             completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt16uWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int16uArgument;
        int16uArgument = [NSNumber numberWithUnsignedShort:0U];
        [cluster writeAttributeInt16uWithValue:int16uArgument
                             completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt16uWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32uWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int32uArgument;
        int32uArgument = [NSNumber numberWithUnsignedInt:4294967295UL];
        [cluster writeAttributeInt32uWithValue:int32uArgument
                             completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32uWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int32uArgument;
        int32uArgument = [NSNumber numberWithUnsignedInt:0UL];
        [cluster writeAttributeInt32uWithValue:int32uArgument
                             completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32uWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt64uWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int64uArgument;
        int64uArgument = [NSNumber numberWithUnsignedLongLong:18446744073709551615ULL];
        [cluster writeAttributeInt64uWithValue:int64uArgument
                             completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt64uWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int64uArgument;
        int64uArgument = [NSNumber numberWithUnsignedLongLong:0ULL];
        [cluster writeAttributeInt64uWithValue:int64uArgument
                             completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt64uWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt8sWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int8sArgument;
        int8sArgument = [NSNumber numberWithChar:127];
        [cluster writeAttributeInt8sWithValue:int8sArgument
                            completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt8sWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int8sArgument;
        int8sArgument = [NSNumber numberWithChar:-128];
        [cluster writeAttributeInt8sWithValue:int8sArgument
                            completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt8sWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int8sArgument;
        int8sArgument = [NSNumber numberWithChar:0];
        [cluster writeAttributeInt8sWithValue:int8sArgument
                            completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt8sWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt16sWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int16sArgument;
        int16sArgument = [NSNumber numberWithShort:32767];
        [cluster writeAttributeInt16sWithValue:int16sArgument
                             completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt16sWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int16sArgument;
        int16sArgument = [NSNumber numberWithShort:-32768];
        [cluster writeAttributeInt16sWithValue:int16sArgument
                             completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt16sWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int16sArgument;
        int16sArgument = [NSNumber numberWithShort:0];
        [cluster writeAttributeInt16sWithValue:int16sArgument
                             completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt16sWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32sWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int32sArgument;
        int32sArgument = [NSNumber numberWithInt:2147483647L];
        [cluster writeAttributeInt32sWithValue:int32sArgument
                             completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32sWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int32sArgument;
        int32sArgument = [NSNumber numberWithInt:-2147483648L];
        [cluster writeAttributeInt32sWithValue:int32sArgument
                             completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32sWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int32sArgument;
        int32sArgument = [NSNumber numberWithInt:0L];
        [cluster writeAttributeInt32sWithValue:int32sArgument
                             completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32sWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt64sWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int64sArgument;
        int64sArgument = [NSNumber numberWithLongLong:9223372036854775807LL];
        [cluster writeAttributeInt64sWithValue:int64sArgument
                             completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt64sWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int64sArgument;
        int64sArgument = [NSNumber numberWithLongLong:-9223372036854775807LL];
        [cluster writeAttributeInt64sWithValue:int64sArgument
                             completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt64sWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int64sArgument;
        int64sArgument = [NSNumber numberWithLongLong:0LL];
        [cluster writeAttributeInt64sWithValue:int64sArgument
                             completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt64sWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFloatSingleWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id floatSingleArgument;
        floatSingleArgument = [NSNumber numberWithFloat:0.1f];
        [cluster writeAttributeFloatSingleWithValue:floatSingleArgument
                                  completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFloatSingleWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id floatSingleArgument;
        floatSingleArgument = [NSNumber numberWithFloat:17000000000.0f];
        [cluster writeAttributeFloatSingleWithValue:floatSingleArgument
                                  completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFloatSingleWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id floatSingleArgument;
        floatSingleArgument = [NSNumber numberWithFloat:1.7e-10f];
        [cluster writeAttributeFloatSingleWithValue:floatSingleArgument
                                  completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFloatSingleWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id floatSingleArgument;
        floatSingleArgument = [NSNumber numberWithFloat:0.0f];
        [cluster writeAttributeFloatSingleWithValue:floatSingleArgument
                                  completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFloatSingleWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFloatDoubleWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id floatDoubleArgument;
        floatDoubleArgument = [NSNumber numberWithDouble:0.1234567890123];
        [cluster writeAttributeFloatDoubleWithValue:floatDoubleArgument
                                  completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFloatDoubleWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id floatDoubleArgument;
        floatDoubleArgument = [NSNumber numberWithDouble:1.7e+200];
        [cluster writeAttributeFloatDoubleWithValue:floatDoubleArgument
                                  completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFloatDoubleWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id floatDoubleArgument;
        floatDoubleArgument = [NSNumber numberWithDouble:1.7e-200];
        [cluster writeAttributeFloatDoubleWithValue:floatDoubleArgument
                                  completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFloatDoubleWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id floatDoubleArgument;
        floatDoubleArgument = [NSNumber numberWithDouble:0];
        [cluster writeAttributeFloatDoubleWithValue:floatDoubleArgument
                                  completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFloatDoubleWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnum8WithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id enum8Argument;
        enum8Argument = [NSNumber numberWithUnsignedChar:255U];
        [cluster writeAttributeEnum8WithValue:enum8Argument
                            completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnum8WithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id enum8Argument;
        enum8Argument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeEnum8WithValue:enum8Argument
                            completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnum8WithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnum16WithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id enum16Argument;
        enum16Argument = [NSNumber numberWithUnsignedShort:65535U];
        [cluster writeAttributeEnum16WithValue:enum16Argument
                             completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnum16WithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id enum16Argument;
        enum16Argument = [NSNumber numberWithUnsignedShort:0U];
        [cluster writeAttributeEnum16WithValue:enum16Argument
                             completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnum16WithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOctetStringWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id octetStringArgument;
        octetStringArgument = [[NSData alloc] initWithBytes:"Tes\000ti\000ng" length:9];
        [cluster writeAttributeOctetStringWithValue:octetStringArgument
                                  completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOctetStringWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint: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
                                  completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOctetStringWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint: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
                                  completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOctetStringWithCompletionHandler:^(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:"\015\012\377\042\240" length:5]));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeOctetString_114()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id octetStringArgument;
        octetStringArgument = [[NSData alloc] initWithBytes:"TestValue" length:9];
        [cluster writeAttributeOctetStringWithValue:octetStringArgument
                                  completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOctetStringWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id octetStringArgument;
        octetStringArgument = [[NSData alloc] initWithBytes:"TestValueLongerThan10" length:21];
        [cluster writeAttributeOctetStringWithValue:octetStringArgument
                                  completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOctetStringWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id octetStringArgument;
        octetStringArgument = [[NSData alloc] initWithBytes:"" length:0];
        [cluster writeAttributeOctetStringWithValue:octetStringArgument
                                  completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLongOctetStringWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id longOctetStringArgument;
        longOctetStringArgument = [[NSData alloc]
            initWithBytes:"11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
                          "11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
                          "11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
                   length:300];
        [cluster writeAttributeLongOctetStringWithValue:longOctetStringArgument
                                      completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLongOctetStringWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id longOctetStringArgument;
        longOctetStringArgument = [[NSData alloc] initWithBytes:"" length:0];
        [cluster writeAttributeLongOctetStringWithValue:longOctetStringArgument
                                      completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id charStringArgument;
        charStringArgument = @"☉T☉";
        [cluster writeAttributeCharStringWithValue:charStringArgument
                                 completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id charStringArgument;
        charStringArgument = @"☉TestValueLongerThan10☉";
        [cluster writeAttributeCharStringWithValue:charStringArgument
                                 completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id charStringArgument;
        charStringArgument = @"";
        [cluster writeAttributeCharStringWithValue:charStringArgument
                                 completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLongCharStringWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id longCharStringArgument;
        longCharStringArgument
            = @"☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉"
              @"☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉"
              @"☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉☉";
        [cluster writeAttributeLongCharStringWithValue:longCharStringArgument
                                     completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLongCharStringWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id longCharStringArgument;
        longCharStringArgument = @"";
        [cluster writeAttributeLongCharStringWithValue:longCharStringArgument
                                     completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeListLongOctetStringWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint: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
                                          completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeListLongOctetStringWithCompletionHandler:^(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 TestReadAttributeEpochUsDefaultValue_136()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEpochUsWithCompletionHandler:^(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_137()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id epochUsArgument;
        epochUsArgument = [NSNumber numberWithUnsignedLongLong:18446744073709551615ULL];
        [cluster writeAttributeEpochUsWithValue:epochUsArgument
                              completionHandler:^(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_138()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEpochUsWithCompletionHandler:^(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_139()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id epochUsArgument;
        epochUsArgument = [NSNumber numberWithUnsignedLongLong:0ULL];
        [cluster writeAttributeEpochUsWithValue:epochUsArgument
                              completionHandler:^(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_140()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEpochUsWithCompletionHandler:^(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_141()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEpochSWithCompletionHandler:^(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_142()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id epochSArgument;
        epochSArgument = [NSNumber numberWithUnsignedInt:4294967295UL];
        [cluster writeAttributeEpochSWithValue:epochSArgument
                             completionHandler:^(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_143()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEpochSWithCompletionHandler:^(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_144()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id epochSArgument;
        epochSArgument = [NSNumber numberWithUnsignedInt:0UL];
        [cluster writeAttributeEpochSWithValue:epochSArgument
                             completionHandler:^(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_145()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEpochSWithCompletionHandler:^(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_146()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeUnsupportedWithCompletionHandler:^(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_147()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id unsupportedArgument;
        unsupportedArgument = [NSNumber numberWithBool:0];
        [cluster writeAttributeUnsupportedWithValue:unsupportedArgument
                                  completionHandler:^(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_148()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:200
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster testWithCompletionHandler:^(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_149()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:0
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster testWithCompletionHandler:^(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_150()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeVendorIdWithCompletionHandler:^(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_151()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id vendorIdArgument;
        vendorIdArgument = [NSNumber numberWithUnsignedShort:17U];
        [cluster writeAttributeVendorIdWithValue:vendorIdArgument
                               completionHandler:^(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_152()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeVendorIdWithCompletionHandler:^(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_153()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id vendorIdArgument;
        vendorIdArgument = [NSNumber numberWithUnsignedShort:0U];
        [cluster writeAttributeVendorIdWithValue:vendorIdArgument
                               completionHandler:^(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_154()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRTestClusterClusterTestEnumsRequestParams alloc] init];
        params.arg1 = [NSNumber numberWithUnsignedShort:20003U];
        params.arg2 = [NSNumber numberWithUnsignedChar:1U];
        [cluster
            testEnumsRequestWithParams:params
                     completionHandler:^(MTRTestClusterClusterTestEnumsResponseParams * _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_155()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRTestClusterClusterTestEnumsRequestParams alloc] init];
        params.arg1 = [NSNumber numberWithUnsignedShort:20003U];
        params.arg2 = [NSNumber numberWithUnsignedChar:101U];
        [cluster
            testEnumsRequestWithParams:params
                     completionHandler:^(MTRTestClusterClusterTestEnumsResponseParams * _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_156()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRTestClusterClusterTestStructArgumentRequestParams alloc] init];
        params.arg1 = [[MTRTestClusterClusterSimpleStruct alloc] init];
        ((MTRTestClusterClusterSimpleStruct *) params.arg1).a = [NSNumber numberWithUnsignedChar:0U];
        ((MTRTestClusterClusterSimpleStruct *) params.arg1).b = [NSNumber numberWithBool:true];
        ((MTRTestClusterClusterSimpleStruct *) params.arg1).c = [NSNumber numberWithUnsignedChar:2U];
        ((MTRTestClusterClusterSimpleStruct *) params.arg1).d = [[NSData alloc] initWithBytes:"octet_string" length:12];
        ((MTRTestClusterClusterSimpleStruct *) params.arg1).e = @"char_string";
        ((MTRTestClusterClusterSimpleStruct *) params.arg1).f = [NSNumber numberWithUnsignedChar:1U];
        ((MTRTestClusterClusterSimpleStruct *) params.arg1).g = [NSNumber numberWithFloat:0.0f];
        ((MTRTestClusterClusterSimpleStruct *) params.arg1).h = [NSNumber numberWithDouble:0];

        [cluster testStructArgumentRequestWithParams:params
                                   completionHandler:^(
                                       MTRTestClusterClusterBooleanResponseParams * _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_157()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRTestClusterClusterTestStructArgumentRequestParams alloc] init];
        params.arg1 = [[MTRTestClusterClusterSimpleStruct alloc] init];
        ((MTRTestClusterClusterSimpleStruct *) params.arg1).a = [NSNumber numberWithUnsignedChar:0U];
        ((MTRTestClusterClusterSimpleStruct *) params.arg1).b = [NSNumber numberWithBool:false];
        ((MTRTestClusterClusterSimpleStruct *) params.arg1).c = [NSNumber numberWithUnsignedChar:2U];
        ((MTRTestClusterClusterSimpleStruct *) params.arg1).d = [[NSData alloc] initWithBytes:"octet_string" length:12];
        ((MTRTestClusterClusterSimpleStruct *) params.arg1).e = @"char_string";
        ((MTRTestClusterClusterSimpleStruct *) params.arg1).f = [NSNumber numberWithUnsignedChar:1U];
        ((MTRTestClusterClusterSimpleStruct *) params.arg1).g = [NSNumber numberWithFloat:0.0f];
        ((MTRTestClusterClusterSimpleStruct *) params.arg1).h = [NSNumber numberWithDouble:0];

        [cluster testStructArgumentRequestWithParams:params
                                   completionHandler:^(
                                       MTRTestClusterClusterBooleanResponseParams * _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_158()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRTestClusterClusterTestNestedStructArgumentRequestParams alloc] init];
        params.arg1 = [[MTRTestClusterClusterNestedStruct alloc] init];
        ((MTRTestClusterClusterNestedStruct *) params.arg1).a = [NSNumber numberWithUnsignedChar:0U];
        ((MTRTestClusterClusterNestedStruct *) params.arg1).b = [NSNumber numberWithBool:true];
        ((MTRTestClusterClusterNestedStruct *) params.arg1).c = [[MTRTestClusterClusterSimpleStruct alloc] init];
        ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStruct *) params.arg1).c).a =
            [NSNumber numberWithUnsignedChar:0U];
        ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStruct *) params.arg1).c).b =
            [NSNumber numberWithBool:true];
        ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStruct *) params.arg1).c).c =
            [NSNumber numberWithUnsignedChar:2U];
        ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStruct *) params.arg1).c).d =
            [[NSData alloc] initWithBytes:"octet_string" length:12];
        ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStruct *) params.arg1).c).e = @"char_string";
        ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStruct *) params.arg1).c).f =
            [NSNumber numberWithUnsignedChar:1U];
        ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStruct *) params.arg1).c).g =
            [NSNumber numberWithFloat:0.0f];
        ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStruct *) params.arg1).c).h =
            [NSNumber numberWithDouble:0];

        [cluster
            testNestedStructArgumentRequestWithParams:params
                                    completionHandler:^(
                                        MTRTestClusterClusterBooleanResponseParams * _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_159()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRTestClusterClusterTestNestedStructArgumentRequestParams alloc] init];
        params.arg1 = [[MTRTestClusterClusterNestedStruct alloc] init];
        ((MTRTestClusterClusterNestedStruct *) params.arg1).a = [NSNumber numberWithUnsignedChar:0U];
        ((MTRTestClusterClusterNestedStruct *) params.arg1).b = [NSNumber numberWithBool:true];
        ((MTRTestClusterClusterNestedStruct *) params.arg1).c = [[MTRTestClusterClusterSimpleStruct alloc] init];
        ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStruct *) params.arg1).c).a =
            [NSNumber numberWithUnsignedChar:0U];
        ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStruct *) params.arg1).c).b =
            [NSNumber numberWithBool:false];
        ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStruct *) params.arg1).c).c =
            [NSNumber numberWithUnsignedChar:2U];
        ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStruct *) params.arg1).c).d =
            [[NSData alloc] initWithBytes:"octet_string" length:12];
        ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStruct *) params.arg1).c).e = @"char_string";
        ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStruct *) params.arg1).c).f =
            [NSNumber numberWithUnsignedChar:1U];
        ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStruct *) params.arg1).c).g =
            [NSNumber numberWithFloat:0.0f];
        ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStruct *) params.arg1).c).h =
            [NSNumber numberWithDouble:0];

        [cluster
            testNestedStructArgumentRequestWithParams:params
                                    completionHandler:^(
                                        MTRTestClusterClusterBooleanResponseParams * _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_160()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRTestClusterClusterTestNestedStructListArgumentRequestParams alloc] init];
        params.arg1 = [[MTRTestClusterClusterNestedStructList alloc] init];
        ((MTRTestClusterClusterNestedStructList *) params.arg1).a = [NSNumber numberWithUnsignedChar:0U];
        ((MTRTestClusterClusterNestedStructList *) params.arg1).b = [NSNumber numberWithBool:true];
        ((MTRTestClusterClusterNestedStructList *) params.arg1).c = [[MTRTestClusterClusterSimpleStruct alloc] init];
        ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStructList *) params.arg1).c).a =
            [NSNumber numberWithUnsignedChar:0U];
        ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStructList *) params.arg1).c).b =
            [NSNumber numberWithBool:true];
        ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStructList *) params.arg1).c).c =
            [NSNumber numberWithUnsignedChar:2U];
        ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStructList *) params.arg1).c).d =
            [[NSData alloc] initWithBytes:"octet_string" length:12];
        ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStructList *) params.arg1).c).e = @"char_string";
        ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStructList *) params.arg1).c).f =
            [NSNumber numberWithUnsignedChar:1U];
        ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStructList *) params.arg1).c).g =
            [NSNumber numberWithFloat:0.0f];
        ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStructList *) params.arg1).c).h =
            [NSNumber numberWithDouble:0];

        {
            NSMutableArray * temp_1 = [[NSMutableArray alloc] init];
            temp_1[0] = [[MTRTestClusterClusterSimpleStruct alloc] init];
            ((MTRTestClusterClusterSimpleStruct *) temp_1[0]).a = [NSNumber numberWithUnsignedChar:1U];
            ((MTRTestClusterClusterSimpleStruct *) temp_1[0]).b = [NSNumber numberWithBool:true];
            ((MTRTestClusterClusterSimpleStruct *) temp_1[0]).c = [NSNumber numberWithUnsignedChar:3U];
            ((MTRTestClusterClusterSimpleStruct *) temp_1[0]).d = [[NSData alloc] initWithBytes:"nested_octet_string" length:19];
            ((MTRTestClusterClusterSimpleStruct *) temp_1[0]).e = @"nested_char_string";
            ((MTRTestClusterClusterSimpleStruct *) temp_1[0]).f = [NSNumber numberWithUnsignedChar:1U];
            ((MTRTestClusterClusterSimpleStruct *) temp_1[0]).g = [NSNumber numberWithFloat:0.0f];
            ((MTRTestClusterClusterSimpleStruct *) temp_1[0]).h = [NSNumber numberWithDouble:0];

            temp_1[1] = [[MTRTestClusterClusterSimpleStruct alloc] init];
            ((MTRTestClusterClusterSimpleStruct *) temp_1[1]).a = [NSNumber numberWithUnsignedChar:2U];
            ((MTRTestClusterClusterSimpleStruct *) temp_1[1]).b = [NSNumber numberWithBool:true];
            ((MTRTestClusterClusterSimpleStruct *) temp_1[1]).c = [NSNumber numberWithUnsignedChar:3U];
            ((MTRTestClusterClusterSimpleStruct *) temp_1[1]).d = [[NSData alloc] initWithBytes:"nested_octet_string" length:19];
            ((MTRTestClusterClusterSimpleStruct *) temp_1[1]).e = @"nested_char_string";
            ((MTRTestClusterClusterSimpleStruct *) temp_1[1]).f = [NSNumber numberWithUnsignedChar:1U];
            ((MTRTestClusterClusterSimpleStruct *) temp_1[1]).g = [NSNumber numberWithFloat:0.0f];
            ((MTRTestClusterClusterSimpleStruct *) temp_1[1]).h = [NSNumber numberWithDouble:0];

            ((MTRTestClusterClusterNestedStructList *) 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];
            ((MTRTestClusterClusterNestedStructList *) 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];
            ((MTRTestClusterClusterNestedStructList *) params.arg1).f = temp_1;
        }
        {
            NSMutableArray * temp_1 = [[NSMutableArray alloc] init];
            temp_1[0] = [NSNumber numberWithUnsignedChar:0U];
            temp_1[1] = [NSNumber numberWithUnsignedChar:255U];
            ((MTRTestClusterClusterNestedStructList *) params.arg1).g = temp_1;
        }

        [cluster testNestedStructListArgumentRequestWithParams:params
                                             completionHandler:^(MTRTestClusterClusterBooleanResponseParams * _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_161()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRTestClusterClusterTestNestedStructListArgumentRequestParams alloc] init];
        params.arg1 = [[MTRTestClusterClusterNestedStructList alloc] init];
        ((MTRTestClusterClusterNestedStructList *) params.arg1).a = [NSNumber numberWithUnsignedChar:0U];
        ((MTRTestClusterClusterNestedStructList *) params.arg1).b = [NSNumber numberWithBool:true];
        ((MTRTestClusterClusterNestedStructList *) params.arg1).c = [[MTRTestClusterClusterSimpleStruct alloc] init];
        ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStructList *) params.arg1).c).a =
            [NSNumber numberWithUnsignedChar:0U];
        ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStructList *) params.arg1).c).b =
            [NSNumber numberWithBool:true];
        ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStructList *) params.arg1).c).c =
            [NSNumber numberWithUnsignedChar:2U];
        ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStructList *) params.arg1).c).d =
            [[NSData alloc] initWithBytes:"octet_string" length:12];
        ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStructList *) params.arg1).c).e = @"char_string";
        ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStructList *) params.arg1).c).f =
            [NSNumber numberWithUnsignedChar:1U];
        ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStructList *) params.arg1).c).g =
            [NSNumber numberWithFloat:0.0f];
        ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStructList *) params.arg1).c).h =
            [NSNumber numberWithDouble:0];

        {
            NSMutableArray * temp_1 = [[NSMutableArray alloc] init];
            temp_1[0] = [[MTRTestClusterClusterSimpleStruct alloc] init];
            ((MTRTestClusterClusterSimpleStruct *) temp_1[0]).a = [NSNumber numberWithUnsignedChar:1U];
            ((MTRTestClusterClusterSimpleStruct *) temp_1[0]).b = [NSNumber numberWithBool:true];
            ((MTRTestClusterClusterSimpleStruct *) temp_1[0]).c = [NSNumber numberWithUnsignedChar:3U];
            ((MTRTestClusterClusterSimpleStruct *) temp_1[0]).d = [[NSData alloc] initWithBytes:"nested_octet_string" length:19];
            ((MTRTestClusterClusterSimpleStruct *) temp_1[0]).e = @"nested_char_string";
            ((MTRTestClusterClusterSimpleStruct *) temp_1[0]).f = [NSNumber numberWithUnsignedChar:1U];
            ((MTRTestClusterClusterSimpleStruct *) temp_1[0]).g = [NSNumber numberWithFloat:0.0f];
            ((MTRTestClusterClusterSimpleStruct *) temp_1[0]).h = [NSNumber numberWithDouble:0];

            temp_1[1] = [[MTRTestClusterClusterSimpleStruct alloc] init];
            ((MTRTestClusterClusterSimpleStruct *) temp_1[1]).a = [NSNumber numberWithUnsignedChar:2U];
            ((MTRTestClusterClusterSimpleStruct *) temp_1[1]).b = [NSNumber numberWithBool:false];
            ((MTRTestClusterClusterSimpleStruct *) temp_1[1]).c = [NSNumber numberWithUnsignedChar:3U];
            ((MTRTestClusterClusterSimpleStruct *) temp_1[1]).d = [[NSData alloc] initWithBytes:"nested_octet_string" length:19];
            ((MTRTestClusterClusterSimpleStruct *) temp_1[1]).e = @"nested_char_string";
            ((MTRTestClusterClusterSimpleStruct *) temp_1[1]).f = [NSNumber numberWithUnsignedChar:1U];
            ((MTRTestClusterClusterSimpleStruct *) temp_1[1]).g = [NSNumber numberWithFloat:0.0f];
            ((MTRTestClusterClusterSimpleStruct *) temp_1[1]).h = [NSNumber numberWithDouble:0];

            ((MTRTestClusterClusterNestedStructList *) 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];
            ((MTRTestClusterClusterNestedStructList *) 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];
            ((MTRTestClusterClusterNestedStructList *) params.arg1).f = temp_1;
        }
        {
            NSMutableArray * temp_1 = [[NSMutableArray alloc] init];
            temp_1[0] = [NSNumber numberWithUnsignedChar:0U];
            temp_1[1] = [NSNumber numberWithUnsignedChar:255U];
            ((MTRTestClusterClusterNestedStructList *) params.arg1).g = temp_1;
        }

        [cluster testNestedStructListArgumentRequestWithParams:params
                                             completionHandler:^(MTRTestClusterClusterBooleanResponseParams * _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_162()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRTestClusterClusterSimpleStructEchoRequestParams alloc] init];
        params.arg1 = [[MTRTestClusterClusterSimpleStruct alloc] init];
        ((MTRTestClusterClusterSimpleStruct *) params.arg1).a = [NSNumber numberWithUnsignedChar:17U];
        ((MTRTestClusterClusterSimpleStruct *) params.arg1).b = [NSNumber numberWithBool:false];
        ((MTRTestClusterClusterSimpleStruct *) params.arg1).c = [NSNumber numberWithUnsignedChar:2U];
        ((MTRTestClusterClusterSimpleStruct *) params.arg1).d = [[NSData alloc] initWithBytes:"octet_string" length:12];
        ((MTRTestClusterClusterSimpleStruct *) params.arg1).e = @"char_string";
        ((MTRTestClusterClusterSimpleStruct *) params.arg1).f = [NSNumber numberWithUnsignedChar:1U];
        ((MTRTestClusterClusterSimpleStruct *) params.arg1).g = [NSNumber numberWithFloat:0.1f];
        ((MTRTestClusterClusterSimpleStruct *) params.arg1).h = [NSNumber numberWithDouble:0.1];

        [cluster
            simpleStructEchoRequestWithParams:params
                            completionHandler:^(
                                MTRTestClusterClusterSimpleStructResponseParams * _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", ((MTRTestClusterClusterSimpleStruct *) actualValue).a, 17U));
                                    VerifyOrReturn(CheckValue("b", ((MTRTestClusterClusterSimpleStruct *) actualValue).b, false));
                                    VerifyOrReturn(CheckValue("c", ((MTRTestClusterClusterSimpleStruct *) actualValue).c, 2U));
                                    VerifyOrReturn(CheckValueAsString("d", ((MTRTestClusterClusterSimpleStruct *) actualValue).d,
                                        [[NSData alloc] initWithBytes:"octet_string" length:12]));
                                    VerifyOrReturn(CheckValueAsString(
                                        "e", ((MTRTestClusterClusterSimpleStruct *) actualValue).e, @"char_string"));
                                    VerifyOrReturn(CheckValue("f", ((MTRTestClusterClusterSimpleStruct *) actualValue).f, 1U));
                                    VerifyOrReturn(CheckValue("g", ((MTRTestClusterClusterSimpleStruct *) actualValue).g, 0.1f));
                                    VerifyOrReturn(CheckValue("h", ((MTRTestClusterClusterSimpleStruct *) actualValue).h, 0.1));
                                }

                                NextTest();
                            }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestCommandWithListOfInt8uAndNoneOfThemIsSetTo0_163()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRTestClusterClusterTestListInt8UArgumentRequestParams 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
                                 completionHandler:^(
                                     MTRTestClusterClusterBooleanResponseParams * _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_164()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRTestClusterClusterTestListInt8UArgumentRequestParams 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
                                      completionHandler:^(
                                          MTRTestClusterClusterBooleanResponseParams * _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_165()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRTestClusterClusterTestListInt8UReverseRequestParams 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
                                     completionHandler:^(MTRTestClusterClusterTestListInt8UReverseResponseParams * _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_166()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRTestClusterClusterTestListInt8UReverseRequestParams alloc] init];
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            params.arg1 = temp_0;
        }
        [cluster
            testListInt8UReverseRequestWithParams:params
                                completionHandler:^(MTRTestClusterClusterTestListInt8UReverseResponseParams * _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_167()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRTestClusterClusterTestListStructArgumentRequestParams alloc] init];
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRTestClusterClusterSimpleStruct alloc] init];
            ((MTRTestClusterClusterSimpleStruct *) temp_0[0]).a = [NSNumber numberWithUnsignedChar:0U];
            ((MTRTestClusterClusterSimpleStruct *) temp_0[0]).b = [NSNumber numberWithBool:true];
            ((MTRTestClusterClusterSimpleStruct *) temp_0[0]).c = [NSNumber numberWithUnsignedChar:2U];
            ((MTRTestClusterClusterSimpleStruct *) temp_0[0]).d = [[NSData alloc] initWithBytes:"first_octet_string" length:18];
            ((MTRTestClusterClusterSimpleStruct *) temp_0[0]).e = @"first_char_string";
            ((MTRTestClusterClusterSimpleStruct *) temp_0[0]).f = [NSNumber numberWithUnsignedChar:1U];
            ((MTRTestClusterClusterSimpleStruct *) temp_0[0]).g = [NSNumber numberWithFloat:0.0f];
            ((MTRTestClusterClusterSimpleStruct *) temp_0[0]).h = [NSNumber numberWithDouble:0];

            temp_0[1] = [[MTRTestClusterClusterSimpleStruct alloc] init];
            ((MTRTestClusterClusterSimpleStruct *) temp_0[1]).a = [NSNumber numberWithUnsignedChar:1U];
            ((MTRTestClusterClusterSimpleStruct *) temp_0[1]).b = [NSNumber numberWithBool:true];
            ((MTRTestClusterClusterSimpleStruct *) temp_0[1]).c = [NSNumber numberWithUnsignedChar:3U];
            ((MTRTestClusterClusterSimpleStruct *) temp_0[1]).d = [[NSData alloc] initWithBytes:"second_octet_string" length:19];
            ((MTRTestClusterClusterSimpleStruct *) temp_0[1]).e = @"second_char_string";
            ((MTRTestClusterClusterSimpleStruct *) temp_0[1]).f = [NSNumber numberWithUnsignedChar:1U];
            ((MTRTestClusterClusterSimpleStruct *) temp_0[1]).g = [NSNumber numberWithFloat:0.0f];
            ((MTRTestClusterClusterSimpleStruct *) temp_0[1]).h = [NSNumber numberWithDouble:0];

            params.arg1 = temp_0;
        }
        [cluster testListStructArgumentRequestWithParams:params
                                       completionHandler:^(
                                           MTRTestClusterClusterBooleanResponseParams * _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_168()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRTestClusterClusterTestListStructArgumentRequestParams alloc] init];
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRTestClusterClusterSimpleStruct alloc] init];
            ((MTRTestClusterClusterSimpleStruct *) temp_0[0]).a = [NSNumber numberWithUnsignedChar:1U];
            ((MTRTestClusterClusterSimpleStruct *) temp_0[0]).b = [NSNumber numberWithBool:true];
            ((MTRTestClusterClusterSimpleStruct *) temp_0[0]).c = [NSNumber numberWithUnsignedChar:3U];
            ((MTRTestClusterClusterSimpleStruct *) temp_0[0]).d = [[NSData alloc] initWithBytes:"second_octet_string" length:19];
            ((MTRTestClusterClusterSimpleStruct *) temp_0[0]).e = @"second_char_string";
            ((MTRTestClusterClusterSimpleStruct *) temp_0[0]).f = [NSNumber numberWithUnsignedChar:1U];
            ((MTRTestClusterClusterSimpleStruct *) temp_0[0]).g = [NSNumber numberWithFloat:0.0f];
            ((MTRTestClusterClusterSimpleStruct *) temp_0[0]).h = [NSNumber numberWithDouble:0];

            temp_0[1] = [[MTRTestClusterClusterSimpleStruct alloc] init];
            ((MTRTestClusterClusterSimpleStruct *) temp_0[1]).a = [NSNumber numberWithUnsignedChar:0U];
            ((MTRTestClusterClusterSimpleStruct *) temp_0[1]).b = [NSNumber numberWithBool:false];
            ((MTRTestClusterClusterSimpleStruct *) temp_0[1]).c = [NSNumber numberWithUnsignedChar:2U];
            ((MTRTestClusterClusterSimpleStruct *) temp_0[1]).d = [[NSData alloc] initWithBytes:"first_octet_string" length:18];
            ((MTRTestClusterClusterSimpleStruct *) temp_0[1]).e = @"first_char_string";
            ((MTRTestClusterClusterSimpleStruct *) temp_0[1]).f = [NSNumber numberWithUnsignedChar:1U];
            ((MTRTestClusterClusterSimpleStruct *) temp_0[1]).g = [NSNumber numberWithFloat:0.0f];
            ((MTRTestClusterClusterSimpleStruct *) temp_0[1]).h = [NSNumber numberWithDouble:0];

            params.arg1 = temp_0;
        }
        [cluster testListStructArgumentRequestWithParams:params
                                       completionHandler:^(
                                           MTRTestClusterClusterBooleanResponseParams * _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_169()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRTestClusterClusterTestListNestedStructListArgumentRequestParams alloc] init];
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRTestClusterClusterNestedStructList alloc] init];
            ((MTRTestClusterClusterNestedStructList *) temp_0[0]).a = [NSNumber numberWithUnsignedChar:0U];
            ((MTRTestClusterClusterNestedStructList *) temp_0[0]).b = [NSNumber numberWithBool:true];
            ((MTRTestClusterClusterNestedStructList *) temp_0[0]).c = [[MTRTestClusterClusterSimpleStruct alloc] init];
            ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStructList *) temp_0[0]).c).a =
                [NSNumber numberWithUnsignedChar:0U];
            ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStructList *) temp_0[0]).c).b =
                [NSNumber numberWithBool:true];
            ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStructList *) temp_0[0]).c).c =
                [NSNumber numberWithUnsignedChar:2U];
            ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStructList *) temp_0[0]).c).d =
                [[NSData alloc] initWithBytes:"octet_string" length:12];
            ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStructList *) temp_0[0]).c).e = @"char_string";
            ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStructList *) temp_0[0]).c).f =
                [NSNumber numberWithUnsignedChar:1U];
            ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStructList *) temp_0[0]).c).g =
                [NSNumber numberWithFloat:0.0f];
            ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStructList *) temp_0[0]).c).h =
                [NSNumber numberWithDouble:0];

            {
                NSMutableArray * temp_2 = [[NSMutableArray alloc] init];
                temp_2[0] = [[MTRTestClusterClusterSimpleStruct alloc] init];
                ((MTRTestClusterClusterSimpleStruct *) temp_2[0]).a = [NSNumber numberWithUnsignedChar:1U];
                ((MTRTestClusterClusterSimpleStruct *) temp_2[0]).b = [NSNumber numberWithBool:true];
                ((MTRTestClusterClusterSimpleStruct *) temp_2[0]).c = [NSNumber numberWithUnsignedChar:3U];
                ((MTRTestClusterClusterSimpleStruct *) temp_2[0]).d = [[NSData alloc] initWithBytes:"nested_octet_string"
                                                                                             length:19];
                ((MTRTestClusterClusterSimpleStruct *) temp_2[0]).e = @"nested_char_string";
                ((MTRTestClusterClusterSimpleStruct *) temp_2[0]).f = [NSNumber numberWithUnsignedChar:1U];
                ((MTRTestClusterClusterSimpleStruct *) temp_2[0]).g = [NSNumber numberWithFloat:0.0f];
                ((MTRTestClusterClusterSimpleStruct *) temp_2[0]).h = [NSNumber numberWithDouble:0];

                temp_2[1] = [[MTRTestClusterClusterSimpleStruct alloc] init];
                ((MTRTestClusterClusterSimpleStruct *) temp_2[1]).a = [NSNumber numberWithUnsignedChar:2U];
                ((MTRTestClusterClusterSimpleStruct *) temp_2[1]).b = [NSNumber numberWithBool:true];
                ((MTRTestClusterClusterSimpleStruct *) temp_2[1]).c = [NSNumber numberWithUnsignedChar:3U];
                ((MTRTestClusterClusterSimpleStruct *) temp_2[1]).d = [[NSData alloc] initWithBytes:"nested_octet_string"
                                                                                             length:19];
                ((MTRTestClusterClusterSimpleStruct *) temp_2[1]).e = @"nested_char_string";
                ((MTRTestClusterClusterSimpleStruct *) temp_2[1]).f = [NSNumber numberWithUnsignedChar:1U];
                ((MTRTestClusterClusterSimpleStruct *) temp_2[1]).g = [NSNumber numberWithFloat:0.0f];
                ((MTRTestClusterClusterSimpleStruct *) temp_2[1]).h = [NSNumber numberWithDouble:0];

                ((MTRTestClusterClusterNestedStructList *) 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];
                ((MTRTestClusterClusterNestedStructList *) 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];
                ((MTRTestClusterClusterNestedStructList *) temp_0[0]).f = temp_2;
            }
            {
                NSMutableArray * temp_2 = [[NSMutableArray alloc] init];
                temp_2[0] = [NSNumber numberWithUnsignedChar:0U];
                temp_2[1] = [NSNumber numberWithUnsignedChar:255U];
                ((MTRTestClusterClusterNestedStructList *) temp_0[0]).g = temp_2;
            }

            params.arg1 = temp_0;
        }
        [cluster testListNestedStructListArgumentRequestWithParams:params
                                                 completionHandler:^(MTRTestClusterClusterBooleanResponseParams * _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_170()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRTestClusterClusterTestListNestedStructListArgumentRequestParams alloc] init];
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRTestClusterClusterNestedStructList alloc] init];
            ((MTRTestClusterClusterNestedStructList *) temp_0[0]).a = [NSNumber numberWithUnsignedChar:0U];
            ((MTRTestClusterClusterNestedStructList *) temp_0[0]).b = [NSNumber numberWithBool:true];
            ((MTRTestClusterClusterNestedStructList *) temp_0[0]).c = [[MTRTestClusterClusterSimpleStruct alloc] init];
            ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStructList *) temp_0[0]).c).a =
                [NSNumber numberWithUnsignedChar:0U];
            ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStructList *) temp_0[0]).c).b =
                [NSNumber numberWithBool:true];
            ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStructList *) temp_0[0]).c).c =
                [NSNumber numberWithUnsignedChar:2U];
            ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStructList *) temp_0[0]).c).d =
                [[NSData alloc] initWithBytes:"octet_string" length:12];
            ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStructList *) temp_0[0]).c).e = @"char_string";
            ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStructList *) temp_0[0]).c).f =
                [NSNumber numberWithUnsignedChar:1U];
            ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStructList *) temp_0[0]).c).g =
                [NSNumber numberWithFloat:0.0f];
            ((MTRTestClusterClusterSimpleStruct *) ((MTRTestClusterClusterNestedStructList *) temp_0[0]).c).h =
                [NSNumber numberWithDouble:0];

            {
                NSMutableArray * temp_2 = [[NSMutableArray alloc] init];
                temp_2[0] = [[MTRTestClusterClusterSimpleStruct alloc] init];
                ((MTRTestClusterClusterSimpleStruct *) temp_2[0]).a = [NSNumber numberWithUnsignedChar:1U];
                ((MTRTestClusterClusterSimpleStruct *) temp_2[0]).b = [NSNumber numberWithBool:true];
                ((MTRTestClusterClusterSimpleStruct *) temp_2[0]).c = [NSNumber numberWithUnsignedChar:3U];
                ((MTRTestClusterClusterSimpleStruct *) temp_2[0]).d = [[NSData alloc] initWithBytes:"nested_octet_string"
                                                                                             length:19];
                ((MTRTestClusterClusterSimpleStruct *) temp_2[0]).e = @"nested_char_string";
                ((MTRTestClusterClusterSimpleStruct *) temp_2[0]).f = [NSNumber numberWithUnsignedChar:1U];
                ((MTRTestClusterClusterSimpleStruct *) temp_2[0]).g = [NSNumber numberWithFloat:0.0f];
                ((MTRTestClusterClusterSimpleStruct *) temp_2[0]).h = [NSNumber numberWithDouble:0];

                temp_2[1] = [[MTRTestClusterClusterSimpleStruct alloc] init];
                ((MTRTestClusterClusterSimpleStruct *) temp_2[1]).a = [NSNumber numberWithUnsignedChar:2U];
                ((MTRTestClusterClusterSimpleStruct *) temp_2[1]).b = [NSNumber numberWithBool:false];
                ((MTRTestClusterClusterSimpleStruct *) temp_2[1]).c = [NSNumber numberWithUnsignedChar:3U];
                ((MTRTestClusterClusterSimpleStruct *) temp_2[1]).d = [[NSData alloc] initWithBytes:"nested_octet_string"
                                                                                             length:19];
                ((MTRTestClusterClusterSimpleStruct *) temp_2[1]).e = @"nested_char_string";
                ((MTRTestClusterClusterSimpleStruct *) temp_2[1]).f = [NSNumber numberWithUnsignedChar:1U];
                ((MTRTestClusterClusterSimpleStruct *) temp_2[1]).g = [NSNumber numberWithFloat:0.0f];
                ((MTRTestClusterClusterSimpleStruct *) temp_2[1]).h = [NSNumber numberWithDouble:0];

                ((MTRTestClusterClusterNestedStructList *) 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];
                ((MTRTestClusterClusterNestedStructList *) 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];
                ((MTRTestClusterClusterNestedStructList *) temp_0[0]).f = temp_2;
            }
            {
                NSMutableArray * temp_2 = [[NSMutableArray alloc] init];
                temp_2[0] = [NSNumber numberWithUnsignedChar:0U];
                temp_2[1] = [NSNumber numberWithUnsignedChar:255U];
                ((MTRTestClusterClusterNestedStructList *) temp_0[0]).g = temp_2;
            }

            params.arg1 = temp_0;
        }
        [cluster testListNestedStructListArgumentRequestWithParams:params
                                                 completionHandler:^(MTRTestClusterClusterBooleanResponseParams * _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_171()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint: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
                                completionHandler:^(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_172()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeListInt8uWithCompletionHandler:^(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_173()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint: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
                                      completionHandler:^(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_174()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeListOctetStringWithCompletionHandler:^(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_175()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id listStructOctetStringArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRTestClusterClusterTestListStructOctet alloc] init];
            ((MTRTestClusterClusterTestListStructOctet *) temp_0[0]).member1 = [NSNumber numberWithUnsignedLongLong:0ULL];
            ((MTRTestClusterClusterTestListStructOctet *) temp_0[0]).member2 = [[NSData alloc] initWithBytes:"Test0" length:5];

            temp_0[1] = [[MTRTestClusterClusterTestListStructOctet alloc] init];
            ((MTRTestClusterClusterTestListStructOctet *) temp_0[1]).member1 = [NSNumber numberWithUnsignedLongLong:1ULL];
            ((MTRTestClusterClusterTestListStructOctet *) temp_0[1]).member2 = [[NSData alloc] initWithBytes:"Test1" length:5];

            temp_0[2] = [[MTRTestClusterClusterTestListStructOctet alloc] init];
            ((MTRTestClusterClusterTestListStructOctet *) temp_0[2]).member1 = [NSNumber numberWithUnsignedLongLong:2ULL];
            ((MTRTestClusterClusterTestListStructOctet *) temp_0[2]).member2 = [[NSData alloc] initWithBytes:"Test2" length:5];

            temp_0[3] = [[MTRTestClusterClusterTestListStructOctet alloc] init];
            ((MTRTestClusterClusterTestListStructOctet *) temp_0[3]).member1 = [NSNumber numberWithUnsignedLongLong:3ULL];
            ((MTRTestClusterClusterTestListStructOctet *) temp_0[3]).member2 = [[NSData alloc] initWithBytes:"Test3" length:5];

            listStructOctetStringArgument = temp_0;
        }
        [cluster writeAttributeListStructOctetStringWithValue:listStructOctetStringArgument
                                            completionHandler:^(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_176()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeListStructOctetStringWithCompletionHandler:^(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", ((MTRTestClusterClusterTestListStructOctet *) actualValue[0]).member1, 0ULL));
                VerifyOrReturn(CheckValueAsString("member2", ((MTRTestClusterClusterTestListStructOctet *) actualValue[0]).member2,
                    [[NSData alloc] initWithBytes:"Test0" length:5]));
                VerifyOrReturn(CheckValue("member1", ((MTRTestClusterClusterTestListStructOctet *) actualValue[1]).member1, 1ULL));
                VerifyOrReturn(CheckValueAsString("member2", ((MTRTestClusterClusterTestListStructOctet *) actualValue[1]).member2,
                    [[NSData alloc] initWithBytes:"Test1" length:5]));
                VerifyOrReturn(CheckValue("member1", ((MTRTestClusterClusterTestListStructOctet *) actualValue[2]).member1, 2ULL));
                VerifyOrReturn(CheckValueAsString("member2", ((MTRTestClusterClusterTestListStructOctet *) actualValue[2]).member2,
                    [[NSData alloc] initWithBytes:"Test2" length:5]));
                VerifyOrReturn(CheckValue("member1", ((MTRTestClusterClusterTestListStructOctet *) actualValue[3]).member1, 3ULL));
                VerifyOrReturn(CheckValueAsString("member2", ((MTRTestClusterClusterTestListStructOctet *) actualValue[3]).member2,
                    [[NSData alloc] initWithBytes:"Test3" length:5]));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendTestCommandWithOptionalArgSet_177()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRTestClusterClusterTestNullableOptionalRequestParams alloc] init];
        params.arg1 = [NSNumber numberWithUnsignedChar:5U];
        [cluster testNullableOptionalRequestWithParams:params
                                     completionHandler:^(MTRTestClusterClusterTestNullableOptionalResponseParams * _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_178()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRTestClusterClusterTestNullableOptionalRequestParams alloc] init];
        [cluster testNullableOptionalRequestWithParams:params
                                     completionHandler:^(MTRTestClusterClusterTestNullableOptionalResponseParams * _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_179()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeListNullablesAndOptionalsStructWithCompletionHandler:^(
            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", ((MTRTestClusterClusterNullablesAndOptionalsStruct *) actualValue[0]).nullableInt));
                VerifyOrReturn(CheckValueNull(
                    "NullableString", ((MTRTestClusterClusterNullablesAndOptionalsStruct *) actualValue[0]).nullableString));
                VerifyOrReturn(CheckValueNull(
                    "NullableStruct", ((MTRTestClusterClusterNullablesAndOptionalsStruct *) actualValue[0]).nullableStruct));
                VerifyOrReturn(CheckValueNull(
                    "NullableList", ((MTRTestClusterClusterNullablesAndOptionalsStruct *) actualValue[0]).nullableList));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteListOfStructsContainingNullablesAndOptionals_180()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id listNullablesAndOptionalsStructArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRTestClusterClusterNullablesAndOptionalsStruct alloc] init];
            ((MTRTestClusterClusterNullablesAndOptionalsStruct *) temp_0[0]).nullableInt = nil;
            ((MTRTestClusterClusterNullablesAndOptionalsStruct *) temp_0[0]).nullableString = nil;
            ((MTRTestClusterClusterNullablesAndOptionalsStruct *) temp_0[0]).nullableStruct = nil;
            {
                NSMutableArray * temp_3 = [[NSMutableArray alloc] init];
                temp_3[0] = [NSNumber numberWithUnsignedChar:1U];
                temp_3[1] = [NSNumber numberWithUnsignedChar:2U];
                ((MTRTestClusterClusterNullablesAndOptionalsStruct *) temp_0[0]).nullableList = temp_3;
            }

            listNullablesAndOptionalsStructArgument = temp_0;
        }
        [cluster
            writeAttributeListNullablesAndOptionalsStructWithValue:listNullablesAndOptionalsStructArgument
                                                 completionHandler:^(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_181()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeListNullablesAndOptionalsStructWithCompletionHandler:^(
            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", ((MTRTestClusterClusterNullablesAndOptionalsStruct *) actualValue[0]).nullableInt));
                VerifyOrReturn(CheckValueNull(
                    "NullableString", ((MTRTestClusterClusterNullablesAndOptionalsStruct *) actualValue[0]).nullableString));
                VerifyOrReturn(CheckValueNull(
                    "NullableStruct", ((MTRTestClusterClusterNullablesAndOptionalsStruct *) actualValue[0]).nullableStruct));
                VerifyOrReturn(CheckValueNonNull(
                    "NullableList", ((MTRTestClusterClusterNullablesAndOptionalsStruct *) actualValue[0]).nullableList));
                VerifyOrReturn(CheckValue("NullableList",
                    [((MTRTestClusterClusterNullablesAndOptionalsStruct *) actualValue[0]).nullableList count],
                    static_cast<uint32_t>(2)));
                VerifyOrReturn(
                    CheckValue("", ((MTRTestClusterClusterNullablesAndOptionalsStruct *) actualValue[0]).nullableList[0], 1U));
                VerifyOrReturn(
                    CheckValue("", ((MTRTestClusterClusterNullablesAndOptionalsStruct *) actualValue[0]).nullableList[1], 2U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestWriteAttributeNullableBooleanNull_182()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableBooleanArgument;
        nullableBooleanArgument = nil;
        [cluster writeAttributeNullableBooleanWithValue:nullableBooleanArgument
                                      completionHandler:^(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_183()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBooleanWithCompletionHandler:^(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_184()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableBooleanArgument;
        nullableBooleanArgument = [NSNumber numberWithBool:true];
        [cluster writeAttributeNullableBooleanWithValue:nullableBooleanArgument
                                      completionHandler:^(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_185()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBooleanWithCompletionHandler:^(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_186()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBooleanWithCompletionHandler:^(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_187()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableBitmap8Argument;
        nullableBitmap8Argument = [NSNumber numberWithUnsignedChar:254U];
        [cluster writeAttributeNullableBitmap8WithValue:nullableBitmap8Argument
                                      completionHandler:^(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_188()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBitmap8WithCompletionHandler:^(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_189()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableBitmap8Argument;
        nullableBitmap8Argument = [NSNumber numberWithUnsignedChar:255U];
        [cluster
            writeAttributeNullableBitmap8WithValue:nullableBitmap8Argument
                                 completionHandler:^(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_190()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBitmap8WithCompletionHandler:^(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_191()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableBitmap8Argument;
        nullableBitmap8Argument = nil;
        [cluster writeAttributeNullableBitmap8WithValue:nullableBitmap8Argument
                                      completionHandler:^(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_192()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBitmap8WithCompletionHandler:^(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_193()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBitmap8WithCompletionHandler:^(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_194()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableBitmap16Argument;
        nullableBitmap16Argument = [NSNumber numberWithUnsignedShort:65534U];
        [cluster writeAttributeNullableBitmap16WithValue:nullableBitmap16Argument
                                       completionHandler:^(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_195()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBitmap16WithCompletionHandler:^(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_196()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableBitmap16Argument;
        nullableBitmap16Argument = [NSNumber numberWithUnsignedShort:65535U];
        [cluster
            writeAttributeNullableBitmap16WithValue:nullableBitmap16Argument
                                  completionHandler:^(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_197()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBitmap16WithCompletionHandler:^(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_198()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableBitmap16Argument;
        nullableBitmap16Argument = nil;
        [cluster writeAttributeNullableBitmap16WithValue:nullableBitmap16Argument
                                       completionHandler:^(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_199()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBitmap16WithCompletionHandler:^(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_200()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableBitmap32Argument;
        nullableBitmap32Argument = [NSNumber numberWithUnsignedInt:4294967294UL];
        [cluster writeAttributeNullableBitmap32WithValue:nullableBitmap32Argument
                                       completionHandler:^(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_201()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBitmap32WithCompletionHandler:^(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_202()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableBitmap32Argument;
        nullableBitmap32Argument = [NSNumber numberWithUnsignedInt:4294967295UL];
        [cluster
            writeAttributeNullableBitmap32WithValue:nullableBitmap32Argument
                                  completionHandler:^(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_203()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBitmap32WithCompletionHandler:^(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_204()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableBitmap32Argument;
        nullableBitmap32Argument = nil;
        [cluster writeAttributeNullableBitmap32WithValue:nullableBitmap32Argument
                                       completionHandler:^(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_205()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBitmap32WithCompletionHandler:^(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_206()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableBitmap64Argument;
        nullableBitmap64Argument = [NSNumber numberWithUnsignedLongLong:18446744073709551614ULL];
        [cluster writeAttributeNullableBitmap64WithValue:nullableBitmap64Argument
                                       completionHandler:^(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_207()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBitmap64WithCompletionHandler:^(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_208()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableBitmap64Argument;
        nullableBitmap64Argument = [NSNumber numberWithUnsignedLongLong:18446744073709551615ULL];
        [cluster
            writeAttributeNullableBitmap64WithValue:nullableBitmap64Argument
                                  completionHandler:^(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_209()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBitmap64WithCompletionHandler:^(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_210()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableBitmap64Argument;
        nullableBitmap64Argument = nil;
        [cluster writeAttributeNullableBitmap64WithValue:nullableBitmap64Argument
                                       completionHandler:^(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_211()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableBitmap64WithCompletionHandler:^(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_212()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt8uArgument;
        nullableInt8uArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeNullableInt8uWithValue:nullableInt8uArgument
                                    completionHandler:^(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_213()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8uWithCompletionHandler:^(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_214()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt8uArgument;
        nullableInt8uArgument = [NSNumber numberWithUnsignedChar:254U];
        [cluster writeAttributeNullableInt8uWithValue:nullableInt8uArgument
                                    completionHandler:^(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_215()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8uWithCompletionHandler:^(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_216()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt8uArgument;
        nullableInt8uArgument = [NSNumber numberWithUnsignedChar:255U];
        [cluster
            writeAttributeNullableInt8uWithValue:nullableInt8uArgument
                               completionHandler:^(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_217()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8uWithCompletionHandler:^(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_218()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8uWithCompletionHandler:^(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_219()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt8uArgument;
        nullableInt8uArgument = nil;
        [cluster writeAttributeNullableInt8uWithValue:nullableInt8uArgument
                                    completionHandler:^(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_220()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8uWithCompletionHandler:^(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_221()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8uWithCompletionHandler:^(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_222()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8uWithCompletionHandler:^(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_223()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt8uArgument;
        nullableInt8uArgument = [NSNumber numberWithUnsignedChar:128U];
        [cluster writeAttributeNullableInt8uWithValue:nullableInt8uArgument
                                    completionHandler:^(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_224()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8uWithCompletionHandler:^(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_225()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8uWithCompletionHandler:^(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_226()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt16uArgument;
        nullableInt16uArgument = [NSNumber numberWithUnsignedShort:0U];
        [cluster writeAttributeNullableInt16uWithValue:nullableInt16uArgument
                                     completionHandler:^(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_227()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt16uWithCompletionHandler:^(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_228()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt16uArgument;
        nullableInt16uArgument = [NSNumber numberWithUnsignedShort:65534U];
        [cluster writeAttributeNullableInt16uWithValue:nullableInt16uArgument
                                     completionHandler:^(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_229()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt16uWithCompletionHandler:^(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_230()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt16uArgument;
        nullableInt16uArgument = [NSNumber numberWithUnsignedShort:65535U];
        [cluster
            writeAttributeNullableInt16uWithValue:nullableInt16uArgument
                                completionHandler:^(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_231()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt16uWithCompletionHandler:^(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_232()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt16uArgument;
        nullableInt16uArgument = nil;
        [cluster writeAttributeNullableInt16uWithValue:nullableInt16uArgument
                                     completionHandler:^(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_233()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt16uWithCompletionHandler:^(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_234()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt16uWithCompletionHandler:^(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_235()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt16uWithCompletionHandler:^(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_236()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt16uArgument;
        nullableInt16uArgument = [NSNumber numberWithUnsignedShort:32000U];
        [cluster writeAttributeNullableInt16uWithValue:nullableInt16uArgument
                                     completionHandler:^(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_237()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt16uWithCompletionHandler:^(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_238()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt16uWithCompletionHandler:^(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_239()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt32uArgument;
        nullableInt32uArgument = [NSNumber numberWithUnsignedInt:0UL];
        [cluster writeAttributeNullableInt32uWithValue:nullableInt32uArgument
                                     completionHandler:^(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_240()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt32uWithCompletionHandler:^(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_241()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt32uArgument;
        nullableInt32uArgument = [NSNumber numberWithUnsignedInt:4294967294UL];
        [cluster writeAttributeNullableInt32uWithValue:nullableInt32uArgument
                                     completionHandler:^(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_242()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt32uWithCompletionHandler:^(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_243()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt32uArgument;
        nullableInt32uArgument = [NSNumber numberWithUnsignedInt:4294967295UL];
        [cluster
            writeAttributeNullableInt32uWithValue:nullableInt32uArgument
                                completionHandler:^(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_244()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt32uWithCompletionHandler:^(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_245()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt32uArgument;
        nullableInt32uArgument = nil;
        [cluster writeAttributeNullableInt32uWithValue:nullableInt32uArgument
                                     completionHandler:^(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_246()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt32uWithCompletionHandler:^(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_247()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt32uWithCompletionHandler:^(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_248()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt32uWithCompletionHandler:^(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_249()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt32uArgument;
        nullableInt32uArgument = [NSNumber numberWithUnsignedInt:2147483647UL];
        [cluster writeAttributeNullableInt32uWithValue:nullableInt32uArgument
                                     completionHandler:^(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_250()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt32uWithCompletionHandler:^(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_251()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt32uWithCompletionHandler:^(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_252()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt64uArgument;
        nullableInt64uArgument = [NSNumber numberWithUnsignedLongLong:0ULL];
        [cluster writeAttributeNullableInt64uWithValue:nullableInt64uArgument
                                     completionHandler:^(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_253()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt64uWithCompletionHandler:^(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_254()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt64uArgument;
        nullableInt64uArgument = [NSNumber numberWithUnsignedLongLong:18446744073709551614ULL];
        [cluster writeAttributeNullableInt64uWithValue:nullableInt64uArgument
                                     completionHandler:^(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_255()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt64uWithCompletionHandler:^(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_256()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt64uArgument;
        nullableInt64uArgument = [NSNumber numberWithUnsignedLongLong:18446744073709551615ULL];
        [cluster
            writeAttributeNullableInt64uWithValue:nullableInt64uArgument
                                completionHandler:^(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_257()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt64uWithCompletionHandler:^(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_258()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt64uArgument;
        nullableInt64uArgument = nil;
        [cluster writeAttributeNullableInt64uWithValue:nullableInt64uArgument
                                     completionHandler:^(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_259()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt64uWithCompletionHandler:^(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_260()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt64uWithCompletionHandler:^(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_261()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt64uWithCompletionHandler:^(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_262()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt64uArgument;
        nullableInt64uArgument = [NSNumber numberWithUnsignedLongLong:18000000000000000000ULL];
        [cluster writeAttributeNullableInt64uWithValue:nullableInt64uArgument
                                     completionHandler:^(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_263()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt64uWithCompletionHandler:^(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_264()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt64uWithCompletionHandler:^(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_265()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt8sArgument;
        nullableInt8sArgument = [NSNumber numberWithChar:-127];
        [cluster writeAttributeNullableInt8sWithValue:nullableInt8sArgument
                                    completionHandler:^(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_266()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8sWithCompletionHandler:^(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_267()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt8sArgument;
        nullableInt8sArgument = [NSNumber numberWithChar:-128];
        [cluster
            writeAttributeNullableInt8sWithValue:nullableInt8sArgument
                               completionHandler:^(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_268()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8sWithCompletionHandler:^(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_269()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt8sArgument;
        nullableInt8sArgument = nil;
        [cluster writeAttributeNullableInt8sWithValue:nullableInt8sArgument
                                    completionHandler:^(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_270()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8sWithCompletionHandler:^(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_271()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8sWithCompletionHandler:^(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_272()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8sWithCompletionHandler:^(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_273()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt8sArgument;
        nullableInt8sArgument = [NSNumber numberWithChar:-127];
        [cluster writeAttributeNullableInt8sWithValue:nullableInt8sArgument
                                    completionHandler:^(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_274()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8sWithCompletionHandler:^(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_275()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt8sWithCompletionHandler:^(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_276()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt16sArgument;
        nullableInt16sArgument = [NSNumber numberWithShort:-32767];
        [cluster writeAttributeNullableInt16sWithValue:nullableInt16sArgument
                                     completionHandler:^(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_277()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt16sWithCompletionHandler:^(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_278()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt16sArgument;
        nullableInt16sArgument = [NSNumber numberWithShort:-32768];
        [cluster
            writeAttributeNullableInt16sWithValue:nullableInt16sArgument
                                completionHandler:^(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_279()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt16sWithCompletionHandler:^(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_280()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt16sArgument;
        nullableInt16sArgument = nil;
        [cluster writeAttributeNullableInt16sWithValue:nullableInt16sArgument
                                     completionHandler:^(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_281()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt16sWithCompletionHandler:^(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_282()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt16sWithCompletionHandler:^(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_283()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt16sWithCompletionHandler:^(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_284()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt16sArgument;
        nullableInt16sArgument = [NSNumber numberWithShort:-32767];
        [cluster writeAttributeNullableInt16sWithValue:nullableInt16sArgument
                                     completionHandler:^(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_285()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt16sWithCompletionHandler:^(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_286()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt16sWithCompletionHandler:^(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_287()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt32sArgument;
        nullableInt32sArgument = [NSNumber numberWithInt:-2147483647L];
        [cluster writeAttributeNullableInt32sWithValue:nullableInt32sArgument
                                     completionHandler:^(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_288()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt32sWithCompletionHandler:^(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_289()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt32sArgument;
        nullableInt32sArgument = [NSNumber numberWithInt:-2147483648L];
        [cluster
            writeAttributeNullableInt32sWithValue:nullableInt32sArgument
                                completionHandler:^(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_290()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt32sWithCompletionHandler:^(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_291()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt32sArgument;
        nullableInt32sArgument = nil;
        [cluster writeAttributeNullableInt32sWithValue:nullableInt32sArgument
                                     completionHandler:^(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_292()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt32sWithCompletionHandler:^(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_293()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt32sWithCompletionHandler:^(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_294()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt32sWithCompletionHandler:^(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_295()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt32sArgument;
        nullableInt32sArgument = [NSNumber numberWithInt:-2147483647L];
        [cluster writeAttributeNullableInt32sWithValue:nullableInt32sArgument
                                     completionHandler:^(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_296()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt32sWithCompletionHandler:^(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_297()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt32sWithCompletionHandler:^(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_298()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt64sArgument;
        nullableInt64sArgument = [NSNumber numberWithLongLong:-9223372036854775807LL];
        [cluster writeAttributeNullableInt64sWithValue:nullableInt64sArgument
                                     completionHandler:^(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_299()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt64sWithCompletionHandler:^(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_300()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt64sArgument;
        nullableInt64sArgument = [NSNumber numberWithLongLong:-9223372036854775807LL - 1LL];
        [cluster
            writeAttributeNullableInt64sWithValue:nullableInt64sArgument
                                completionHandler:^(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_301()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt64sWithCompletionHandler:^(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_302()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt64sArgument;
        nullableInt64sArgument = nil;
        [cluster writeAttributeNullableInt64sWithValue:nullableInt64sArgument
                                     completionHandler:^(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_303()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt64sWithCompletionHandler:^(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_304()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt64sWithCompletionHandler:^(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_305()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt64sWithCompletionHandler:^(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_306()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableInt64sArgument;
        nullableInt64sArgument = [NSNumber numberWithLongLong:-9223372036854775807LL];
        [cluster writeAttributeNullableInt64sWithValue:nullableInt64sArgument
                                     completionHandler:^(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_307()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt64sWithCompletionHandler:^(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_308()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableInt64sWithCompletionHandler:^(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_309()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableFloatSingleArgument;
        nullableFloatSingleArgument = [NSNumber numberWithFloat:0.1f];
        [cluster writeAttributeNullableFloatSingleWithValue:nullableFloatSingleArgument
                                          completionHandler:^(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_310()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableFloatSingleWithCompletionHandler:^(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_311()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableFloatSingleArgument;
        nullableFloatSingleArgument = [NSNumber numberWithFloat:INFINITY];
        [cluster writeAttributeNullableFloatSingleWithValue:nullableFloatSingleArgument
                                          completionHandler:^(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_312()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableFloatSingleWithCompletionHandler:^(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_313()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableFloatSingleArgument;
        nullableFloatSingleArgument = [NSNumber numberWithFloat:-INFINITY];
        [cluster writeAttributeNullableFloatSingleWithValue:nullableFloatSingleArgument
                                          completionHandler:^(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_314()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableFloatSingleWithCompletionHandler:^(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_315()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableFloatSingleArgument;
        nullableFloatSingleArgument = nil;
        [cluster writeAttributeNullableFloatSingleWithValue:nullableFloatSingleArgument
                                          completionHandler:^(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_316()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableFloatSingleWithCompletionHandler:^(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_317()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableFloatSingleArgument;
        nullableFloatSingleArgument = [NSNumber numberWithFloat:0.0f];
        [cluster writeAttributeNullableFloatSingleWithValue:nullableFloatSingleArgument
                                          completionHandler:^(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_318()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableFloatSingleWithCompletionHandler:^(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_319()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableFloatDoubleArgument;
        nullableFloatDoubleArgument = [NSNumber numberWithDouble:0.1234567890123];
        [cluster writeAttributeNullableFloatDoubleWithValue:nullableFloatDoubleArgument
                                          completionHandler:^(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_320()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableFloatDoubleWithCompletionHandler:^(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_321()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableFloatDoubleArgument;
        nullableFloatDoubleArgument = [NSNumber numberWithDouble:INFINITY];
        [cluster writeAttributeNullableFloatDoubleWithValue:nullableFloatDoubleArgument
                                          completionHandler:^(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_322()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableFloatDoubleWithCompletionHandler:^(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_323()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableFloatDoubleArgument;
        nullableFloatDoubleArgument = [NSNumber numberWithDouble:-INFINITY];
        [cluster writeAttributeNullableFloatDoubleWithValue:nullableFloatDoubleArgument
                                          completionHandler:^(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_324()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableFloatDoubleWithCompletionHandler:^(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_325()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableFloatDoubleArgument;
        nullableFloatDoubleArgument = nil;
        [cluster writeAttributeNullableFloatDoubleWithValue:nullableFloatDoubleArgument
                                          completionHandler:^(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_326()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableFloatDoubleWithCompletionHandler:^(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_327()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableFloatDoubleArgument;
        nullableFloatDoubleArgument = [NSNumber numberWithDouble:0];
        [cluster writeAttributeNullableFloatDoubleWithValue:nullableFloatDoubleArgument
                                          completionHandler:^(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_328()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableFloatDoubleWithCompletionHandler:^(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_329()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableEnum8Argument;
        nullableEnum8Argument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeNullableEnum8WithValue:nullableEnum8Argument
                                    completionHandler:^(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_330()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableEnum8WithCompletionHandler:^(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_331()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableEnum8Argument;
        nullableEnum8Argument = [NSNumber numberWithUnsignedChar:254U];
        [cluster writeAttributeNullableEnum8WithValue:nullableEnum8Argument
                                    completionHandler:^(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_332()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableEnum8WithCompletionHandler:^(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_333()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableEnum8Argument;
        nullableEnum8Argument = [NSNumber numberWithUnsignedChar:255U];
        [cluster
            writeAttributeNullableEnum8WithValue:nullableEnum8Argument
                               completionHandler:^(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_334()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableEnum8WithCompletionHandler:^(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_335()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableEnum8Argument;
        nullableEnum8Argument = nil;
        [cluster writeAttributeNullableEnum8WithValue:nullableEnum8Argument
                                    completionHandler:^(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_336()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableEnum8WithCompletionHandler:^(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_337()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableEnum16Argument;
        nullableEnum16Argument = [NSNumber numberWithUnsignedShort:0U];
        [cluster writeAttributeNullableEnum16WithValue:nullableEnum16Argument
                                     completionHandler:^(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_338()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableEnum16WithCompletionHandler:^(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_339()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableEnum16Argument;
        nullableEnum16Argument = [NSNumber numberWithUnsignedShort:65534U];
        [cluster writeAttributeNullableEnum16WithValue:nullableEnum16Argument
                                     completionHandler:^(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_340()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableEnum16WithCompletionHandler:^(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_341()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableEnum16Argument;
        nullableEnum16Argument = [NSNumber numberWithUnsignedShort:65535U];
        [cluster
            writeAttributeNullableEnum16WithValue:nullableEnum16Argument
                                completionHandler:^(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_342()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableEnum16WithCompletionHandler:^(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_343()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableEnum16Argument;
        nullableEnum16Argument = nil;
        [cluster writeAttributeNullableEnum16WithValue:nullableEnum16Argument
                                     completionHandler:^(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_344()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableEnum16WithCompletionHandler:^(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_345()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableEnumAttrArgument;
        nullableEnumAttrArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeNullableEnumAttrWithValue:nullableEnumAttrArgument
                                       completionHandler:^(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_346()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableEnumAttrWithCompletionHandler:^(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_347()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableEnumAttrArgument;
        nullableEnumAttrArgument = [NSNumber numberWithUnsignedChar:3U];
        [cluster writeAttributeNullableEnumAttrWithValue:nullableEnumAttrArgument
                                       completionHandler:^(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_348()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableEnumAttrWithCompletionHandler:^(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_349()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableEnumAttrArgument;
        nullableEnumAttrArgument = [NSNumber numberWithUnsignedChar:255U];
        [cluster
            writeAttributeNullableEnumAttrWithValue:nullableEnumAttrArgument
                                  completionHandler:^(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_350()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableEnumAttrWithCompletionHandler:^(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_351()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableEnumAttrArgument;
        nullableEnumAttrArgument = nil;
        [cluster writeAttributeNullableEnumAttrWithValue:nullableEnumAttrArgument
                                       completionHandler:^(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_352()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableEnumAttrWithCompletionHandler:^(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_353()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableEnumAttrWithCompletionHandler:^(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_354()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableOctetStringWithCompletionHandler:^(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_355()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableOctetStringArgument;
        nullableOctetStringArgument = [[NSData alloc] initWithBytes:"TestValue" length:9];
        [cluster writeAttributeNullableOctetStringWithValue:nullableOctetStringArgument
                                          completionHandler:^(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_356()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableOctetStringWithCompletionHandler:^(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_357()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableOctetStringArgument;
        nullableOctetStringArgument = nil;
        [cluster writeAttributeNullableOctetStringWithValue:nullableOctetStringArgument
                                          completionHandler:^(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_358()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableOctetStringWithCompletionHandler:^(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_359()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableOctetStringArgument;
        nullableOctetStringArgument = [[NSData alloc] initWithBytes:"" length:0];
        [cluster writeAttributeNullableOctetStringWithValue:nullableOctetStringArgument
                                          completionHandler:^(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_360()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableOctetStringWithCompletionHandler:^(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_361()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableOctetStringWithCompletionHandler:^(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_362()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableCharStringWithCompletionHandler:^(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_363()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableCharStringArgument;
        nullableCharStringArgument = @"☉T☉";
        [cluster writeAttributeNullableCharStringWithValue:nullableCharStringArgument
                                         completionHandler:^(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_364()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableCharStringWithCompletionHandler:^(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_365()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableCharStringWithCompletionHandler:^(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_366()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableCharStringArgument;
        nullableCharStringArgument = nil;
        [cluster writeAttributeNullableCharStringWithValue:nullableCharStringArgument
                                         completionHandler:^(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_367()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableCharStringWithCompletionHandler:^(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_368()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableCharStringArgument;
        nullableCharStringArgument = @"";
        [cluster writeAttributeNullableCharStringWithValue:nullableCharStringArgument
                                         completionHandler:^(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_369()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableCharStringWithCompletionHandler:^(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_370()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNullableCharStringWithCompletionHandler:^(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_371()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:200
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeListInt8uWithCompletionHandler:^(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_372()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:0
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeListInt8uWithCompletionHandler:^(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_373()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRTestClusterClusterTestSimpleOptionalArgumentRequestParams alloc] init];
        [cluster
            testSimpleOptionalArgumentRequestWithParams:params
                                      completionHandler:^(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_INVALID_VALUE));
                                          NextTest();
                                      }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSendACommandThatTakesAnOptionalParameterButDoNotSetIt_374()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRTestClusterClusterTestSimpleOptionalArgumentRequestParams alloc] init];
        params.arg1 = [NSNumber numberWithBool:1];
        [cluster
            testSimpleOptionalArgumentRequestWithParams:params
                                      completionHandler:^(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_375_WaitForReport_Fulfilled = false;
    ResponseHandler _Nullable test_TestCluster_list_int8u_Reported = nil;

    CHIP_ERROR TestReportSubscribeToListAttribute_375()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint: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_375_WaitForReport_Fulfilled = true;
        };

        NextTest();
        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestSubscribeToListAttribute_376()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        uint16_t minIntervalArgument = 2U;
        uint16_t maxIntervalArgument = 5U;
        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] init];
        [cluster subscribeAttributeListInt8uWithMinInterval:[NSNumber numberWithUnsignedInt:minIntervalArgument]
            maxInterval:[NSNumber numberWithUnsignedInt:maxIntervalArgument]
            params:params
            subscriptionEstablished:^{
                VerifyOrReturn(
                    testSendClusterTestCluster_375_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_377()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint: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
                                completionHandler:^(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_378()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint: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_379()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt8uWithCompletionHandler:^(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_380()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt8uArgument;
        rangeRestrictedInt8uArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster
            writeAttributeRangeRestrictedInt8uWithValue:rangeRestrictedInt8uArgument
                                      completionHandler:^(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_381()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt8uArgument;
        rangeRestrictedInt8uArgument = [NSNumber numberWithUnsignedChar:19U];
        [cluster writeAttributeRangeRestrictedInt8uWithValue:rangeRestrictedInt8uArgument
                                           completionHandler:^(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_382()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt8uArgument;
        rangeRestrictedInt8uArgument = [NSNumber numberWithUnsignedChar:101U];
        [cluster writeAttributeRangeRestrictedInt8uWithValue:rangeRestrictedInt8uArgument
                                           completionHandler:^(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_383()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt8uArgument;
        rangeRestrictedInt8uArgument = [NSNumber numberWithUnsignedChar:255U];
        [cluster
            writeAttributeRangeRestrictedInt8uWithValue:rangeRestrictedInt8uArgument
                                      completionHandler:^(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_384()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt8uWithCompletionHandler:^(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_385()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt8uArgument;
        rangeRestrictedInt8uArgument = [NSNumber numberWithUnsignedChar:20U];
        [cluster
            writeAttributeRangeRestrictedInt8uWithValue:rangeRestrictedInt8uArgument
                                      completionHandler:^(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_386()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt8uWithCompletionHandler:^(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_387()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt8uArgument;
        rangeRestrictedInt8uArgument = [NSNumber numberWithUnsignedChar:100U];
        [cluster
            writeAttributeRangeRestrictedInt8uWithValue:rangeRestrictedInt8uArgument
                                      completionHandler:^(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_388()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt8uWithCompletionHandler:^(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_389()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt8uArgument;
        rangeRestrictedInt8uArgument = [NSNumber numberWithUnsignedChar:50U];
        [cluster
            writeAttributeRangeRestrictedInt8uWithValue:rangeRestrictedInt8uArgument
                                      completionHandler:^(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_390()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt8uWithCompletionHandler:^(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_391()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt16uWithCompletionHandler:^(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_392()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt16uArgument;
        rangeRestrictedInt16uArgument = [NSNumber numberWithUnsignedShort:0U];
        [cluster
            writeAttributeRangeRestrictedInt16uWithValue:rangeRestrictedInt16uArgument
                                       completionHandler:^(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_393()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt16uArgument;
        rangeRestrictedInt16uArgument = [NSNumber numberWithUnsignedShort:99U];
        [cluster writeAttributeRangeRestrictedInt16uWithValue:rangeRestrictedInt16uArgument
                                            completionHandler:^(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_394()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt16uArgument;
        rangeRestrictedInt16uArgument = [NSNumber numberWithUnsignedShort:1001U];
        [cluster writeAttributeRangeRestrictedInt16uWithValue:rangeRestrictedInt16uArgument
                                            completionHandler:^(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_395()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt16uArgument;
        rangeRestrictedInt16uArgument = [NSNumber numberWithUnsignedShort:65535U];
        [cluster
            writeAttributeRangeRestrictedInt16uWithValue:rangeRestrictedInt16uArgument
                                       completionHandler:^(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_396()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt16uWithCompletionHandler:^(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_397()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt16uArgument;
        rangeRestrictedInt16uArgument = [NSNumber numberWithUnsignedShort:100U];
        [cluster
            writeAttributeRangeRestrictedInt16uWithValue:rangeRestrictedInt16uArgument
                                       completionHandler:^(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_398()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt16uWithCompletionHandler:^(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_399()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt16uArgument;
        rangeRestrictedInt16uArgument = [NSNumber numberWithUnsignedShort:1000U];
        [cluster
            writeAttributeRangeRestrictedInt16uWithValue:rangeRestrictedInt16uArgument
                                       completionHandler:^(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_400()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt16uWithCompletionHandler:^(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_401()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt16uArgument;
        rangeRestrictedInt16uArgument = [NSNumber numberWithUnsignedShort:500U];
        [cluster
            writeAttributeRangeRestrictedInt16uWithValue:rangeRestrictedInt16uArgument
                                       completionHandler:^(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_402()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt16uWithCompletionHandler:^(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_403()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt8sWithCompletionHandler:^(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_404()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt8sArgument;
        rangeRestrictedInt8sArgument = [NSNumber numberWithChar:-128];
        [cluster writeAttributeRangeRestrictedInt8sWithValue:rangeRestrictedInt8sArgument
                                           completionHandler:^(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_405()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt8sArgument;
        rangeRestrictedInt8sArgument = [NSNumber numberWithChar:-41];
        [cluster
            writeAttributeRangeRestrictedInt8sWithValue:rangeRestrictedInt8sArgument
                                      completionHandler:^(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_406()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt8sArgument;
        rangeRestrictedInt8sArgument = [NSNumber numberWithChar:51];
        [cluster
            writeAttributeRangeRestrictedInt8sWithValue:rangeRestrictedInt8sArgument
                                      completionHandler:^(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_407()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt8sArgument;
        rangeRestrictedInt8sArgument = [NSNumber numberWithChar:127];
        [cluster writeAttributeRangeRestrictedInt8sWithValue:rangeRestrictedInt8sArgument
                                           completionHandler:^(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_408()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt8sWithCompletionHandler:^(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_409()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt8sArgument;
        rangeRestrictedInt8sArgument = [NSNumber numberWithChar:-40];
        [cluster
            writeAttributeRangeRestrictedInt8sWithValue:rangeRestrictedInt8sArgument
                                      completionHandler:^(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_410()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt8sWithCompletionHandler:^(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_411()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt8sArgument;
        rangeRestrictedInt8sArgument = [NSNumber numberWithChar:50];
        [cluster
            writeAttributeRangeRestrictedInt8sWithValue:rangeRestrictedInt8sArgument
                                      completionHandler:^(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_412()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt8sWithCompletionHandler:^(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_413()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt8sArgument;
        rangeRestrictedInt8sArgument = [NSNumber numberWithChar:6];
        [cluster
            writeAttributeRangeRestrictedInt8sWithValue:rangeRestrictedInt8sArgument
                                      completionHandler:^(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_414()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt8sWithCompletionHandler:^(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_415()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt16sWithCompletionHandler:^(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_416()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt16sArgument;
        rangeRestrictedInt16sArgument = [NSNumber numberWithShort:-32768];
        [cluster
            writeAttributeRangeRestrictedInt16sWithValue:rangeRestrictedInt16sArgument
                                       completionHandler:^(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_417()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt16sArgument;
        rangeRestrictedInt16sArgument = [NSNumber numberWithShort:-151];
        [cluster writeAttributeRangeRestrictedInt16sWithValue:rangeRestrictedInt16sArgument
                                            completionHandler:^(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_418()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt16sArgument;
        rangeRestrictedInt16sArgument = [NSNumber numberWithShort:201];
        [cluster writeAttributeRangeRestrictedInt16sWithValue:rangeRestrictedInt16sArgument
                                            completionHandler:^(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_419()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt16sArgument;
        rangeRestrictedInt16sArgument = [NSNumber numberWithShort:32767];
        [cluster
            writeAttributeRangeRestrictedInt16sWithValue:rangeRestrictedInt16sArgument
                                       completionHandler:^(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_420()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt16sWithCompletionHandler:^(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_421()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt16sArgument;
        rangeRestrictedInt16sArgument = [NSNumber numberWithShort:-150];
        [cluster
            writeAttributeRangeRestrictedInt16sWithValue:rangeRestrictedInt16sArgument
                                       completionHandler:^(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_422()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt16sWithCompletionHandler:^(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_423()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt16sArgument;
        rangeRestrictedInt16sArgument = [NSNumber numberWithShort:200];
        [cluster
            writeAttributeRangeRestrictedInt16sWithValue:rangeRestrictedInt16sArgument
                                       completionHandler:^(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_424()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt16sWithCompletionHandler:^(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_425()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id rangeRestrictedInt16sArgument;
        rangeRestrictedInt16sArgument = [NSNumber numberWithShort:7];
        [cluster
            writeAttributeRangeRestrictedInt16sWithValue:rangeRestrictedInt16sArgument
                                       completionHandler:^(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_426()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeRangeRestrictedInt16sWithCompletionHandler:^(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_427()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeNullableRangeRestrictedInt8uWithCompletionHandler:^(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_428()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8uArgument;
        nullableRangeRestrictedInt8uArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeNullableRangeRestrictedInt8uWithValue:nullableRangeRestrictedInt8uArgument
                                                   completionHandler:^(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_429()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8uArgument;
        nullableRangeRestrictedInt8uArgument = [NSNumber numberWithUnsignedChar:19U];
        [cluster writeAttributeNullableRangeRestrictedInt8uWithValue:nullableRangeRestrictedInt8uArgument
                                                   completionHandler:^(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_430()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8uArgument;
        nullableRangeRestrictedInt8uArgument = [NSNumber numberWithUnsignedChar:101U];
        [cluster writeAttributeNullableRangeRestrictedInt8uWithValue:nullableRangeRestrictedInt8uArgument
                                                   completionHandler:^(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_431()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8uArgument;
        nullableRangeRestrictedInt8uArgument = [NSNumber numberWithUnsignedChar:254U];
        [cluster writeAttributeNullableRangeRestrictedInt8uWithValue:nullableRangeRestrictedInt8uArgument
                                                   completionHandler:^(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_432()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeNullableRangeRestrictedInt8uWithCompletionHandler:^(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_433()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8uArgument;
        nullableRangeRestrictedInt8uArgument = [NSNumber numberWithUnsignedChar:20U];
        [cluster writeAttributeNullableRangeRestrictedInt8uWithValue:nullableRangeRestrictedInt8uArgument
                                                   completionHandler:^(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_434()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeNullableRangeRestrictedInt8uWithCompletionHandler:^(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_435()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8uArgument;
        nullableRangeRestrictedInt8uArgument = [NSNumber numberWithUnsignedChar:100U];
        [cluster writeAttributeNullableRangeRestrictedInt8uWithValue:nullableRangeRestrictedInt8uArgument
                                                   completionHandler:^(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_436()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeNullableRangeRestrictedInt8uWithCompletionHandler:^(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_437()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8uArgument;
        nullableRangeRestrictedInt8uArgument = [NSNumber numberWithUnsignedChar:50U];
        [cluster writeAttributeNullableRangeRestrictedInt8uWithValue:nullableRangeRestrictedInt8uArgument
                                                   completionHandler:^(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_438()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeNullableRangeRestrictedInt8uWithCompletionHandler:^(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_439()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8uArgument;
        nullableRangeRestrictedInt8uArgument = nil;
        [cluster writeAttributeNullableRangeRestrictedInt8uWithValue:nullableRangeRestrictedInt8uArgument
                                                   completionHandler:^(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_440()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeNullableRangeRestrictedInt8uWithCompletionHandler:^(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_441()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeNullableRangeRestrictedInt16uWithCompletionHandler:^(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_442()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16uArgument;
        nullableRangeRestrictedInt16uArgument = [NSNumber numberWithUnsignedShort:0U];
        [cluster writeAttributeNullableRangeRestrictedInt16uWithValue:nullableRangeRestrictedInt16uArgument
                                                    completionHandler:^(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_443()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16uArgument;
        nullableRangeRestrictedInt16uArgument = [NSNumber numberWithUnsignedShort:99U];
        [cluster writeAttributeNullableRangeRestrictedInt16uWithValue:nullableRangeRestrictedInt16uArgument
                                                    completionHandler:^(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_444()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16uArgument;
        nullableRangeRestrictedInt16uArgument = [NSNumber numberWithUnsignedShort:1001U];
        [cluster writeAttributeNullableRangeRestrictedInt16uWithValue:nullableRangeRestrictedInt16uArgument
                                                    completionHandler:^(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_445()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16uArgument;
        nullableRangeRestrictedInt16uArgument = [NSNumber numberWithUnsignedShort:65534U];
        [cluster writeAttributeNullableRangeRestrictedInt16uWithValue:nullableRangeRestrictedInt16uArgument
                                                    completionHandler:^(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_446()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeNullableRangeRestrictedInt16uWithCompletionHandler:^(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_447()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16uArgument;
        nullableRangeRestrictedInt16uArgument = [NSNumber numberWithUnsignedShort:100U];
        [cluster writeAttributeNullableRangeRestrictedInt16uWithValue:nullableRangeRestrictedInt16uArgument
                                                    completionHandler:^(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_448()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeNullableRangeRestrictedInt16uWithCompletionHandler:^(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_449()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16uArgument;
        nullableRangeRestrictedInt16uArgument = [NSNumber numberWithUnsignedShort:1000U];
        [cluster writeAttributeNullableRangeRestrictedInt16uWithValue:nullableRangeRestrictedInt16uArgument
                                                    completionHandler:^(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_450()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeNullableRangeRestrictedInt16uWithCompletionHandler:^(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_451()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16uArgument;
        nullableRangeRestrictedInt16uArgument = [NSNumber numberWithUnsignedShort:500U];
        [cluster writeAttributeNullableRangeRestrictedInt16uWithValue:nullableRangeRestrictedInt16uArgument
                                                    completionHandler:^(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_452()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeNullableRangeRestrictedInt16uWithCompletionHandler:^(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_453()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16uArgument;
        nullableRangeRestrictedInt16uArgument = nil;
        [cluster writeAttributeNullableRangeRestrictedInt16uWithValue:nullableRangeRestrictedInt16uArgument
                                                    completionHandler:^(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_454()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeNullableRangeRestrictedInt16uWithCompletionHandler:^(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_455()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeNullableRangeRestrictedInt8sWithCompletionHandler:^(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_456()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8sArgument;
        nullableRangeRestrictedInt8sArgument = [NSNumber numberWithChar:-127];
        [cluster writeAttributeNullableRangeRestrictedInt8sWithValue:nullableRangeRestrictedInt8sArgument
                                                   completionHandler:^(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_457()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8sArgument;
        nullableRangeRestrictedInt8sArgument = [NSNumber numberWithChar:-41];
        [cluster writeAttributeNullableRangeRestrictedInt8sWithValue:nullableRangeRestrictedInt8sArgument
                                                   completionHandler:^(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_458()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8sArgument;
        nullableRangeRestrictedInt8sArgument = [NSNumber numberWithChar:51];
        [cluster writeAttributeNullableRangeRestrictedInt8sWithValue:nullableRangeRestrictedInt8sArgument
                                                   completionHandler:^(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_459()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8sArgument;
        nullableRangeRestrictedInt8sArgument = [NSNumber numberWithChar:127];
        [cluster writeAttributeNullableRangeRestrictedInt8sWithValue:nullableRangeRestrictedInt8sArgument
                                                   completionHandler:^(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_460()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeNullableRangeRestrictedInt8sWithCompletionHandler:^(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_461()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8sArgument;
        nullableRangeRestrictedInt8sArgument = [NSNumber numberWithChar:-40];
        [cluster writeAttributeNullableRangeRestrictedInt8sWithValue:nullableRangeRestrictedInt8sArgument
                                                   completionHandler:^(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_462()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeNullableRangeRestrictedInt8sWithCompletionHandler:^(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_463()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8sArgument;
        nullableRangeRestrictedInt8sArgument = [NSNumber numberWithChar:50];
        [cluster writeAttributeNullableRangeRestrictedInt8sWithValue:nullableRangeRestrictedInt8sArgument
                                                   completionHandler:^(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_464()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeNullableRangeRestrictedInt8sWithCompletionHandler:^(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_465()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8sArgument;
        nullableRangeRestrictedInt8sArgument = [NSNumber numberWithChar:6];
        [cluster writeAttributeNullableRangeRestrictedInt8sWithValue:nullableRangeRestrictedInt8sArgument
                                                   completionHandler:^(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_466()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeNullableRangeRestrictedInt8sWithCompletionHandler:^(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_467()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt8sArgument;
        nullableRangeRestrictedInt8sArgument = nil;
        [cluster writeAttributeNullableRangeRestrictedInt8sWithValue:nullableRangeRestrictedInt8sArgument
                                                   completionHandler:^(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_468()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeNullableRangeRestrictedInt8sWithCompletionHandler:^(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_469()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeNullableRangeRestrictedInt16sWithCompletionHandler:^(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_470()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16sArgument;
        nullableRangeRestrictedInt16sArgument = [NSNumber numberWithShort:-32767];
        [cluster writeAttributeNullableRangeRestrictedInt16sWithValue:nullableRangeRestrictedInt16sArgument
                                                    completionHandler:^(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_471()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16sArgument;
        nullableRangeRestrictedInt16sArgument = [NSNumber numberWithShort:-151];
        [cluster writeAttributeNullableRangeRestrictedInt16sWithValue:nullableRangeRestrictedInt16sArgument
                                                    completionHandler:^(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_472()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16sArgument;
        nullableRangeRestrictedInt16sArgument = [NSNumber numberWithShort:201];
        [cluster writeAttributeNullableRangeRestrictedInt16sWithValue:nullableRangeRestrictedInt16sArgument
                                                    completionHandler:^(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_473()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16sArgument;
        nullableRangeRestrictedInt16sArgument = [NSNumber numberWithShort:32767];
        [cluster writeAttributeNullableRangeRestrictedInt16sWithValue:nullableRangeRestrictedInt16sArgument
                                                    completionHandler:^(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_474()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeNullableRangeRestrictedInt16sWithCompletionHandler:^(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_475()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16sArgument;
        nullableRangeRestrictedInt16sArgument = [NSNumber numberWithShort:-150];
        [cluster writeAttributeNullableRangeRestrictedInt16sWithValue:nullableRangeRestrictedInt16sArgument
                                                    completionHandler:^(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_476()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeNullableRangeRestrictedInt16sWithCompletionHandler:^(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_477()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16sArgument;
        nullableRangeRestrictedInt16sArgument = [NSNumber numberWithShort:200];
        [cluster writeAttributeNullableRangeRestrictedInt16sWithValue:nullableRangeRestrictedInt16sArgument
                                                    completionHandler:^(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_478()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeNullableRangeRestrictedInt16sWithCompletionHandler:^(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_479()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16sArgument;
        nullableRangeRestrictedInt16sArgument = [NSNumber numberWithShort:7];
        [cluster writeAttributeNullableRangeRestrictedInt16sWithValue:nullableRangeRestrictedInt16sArgument
                                                    completionHandler:^(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_480()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeNullableRangeRestrictedInt16sWithCompletionHandler:^(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_481()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nullableRangeRestrictedInt16sArgument;
        nullableRangeRestrictedInt16sArgument = nil;
        [cluster writeAttributeNullableRangeRestrictedInt16sWithValue:nullableRangeRestrictedInt16sArgument
                                                    completionHandler:^(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_482()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeNullableRangeRestrictedInt16sWithCompletionHandler:^(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_483()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id generalErrorBooleanArgument;
        generalErrorBooleanArgument = [NSNumber numberWithBool:false];
        [cluster writeAttributeGeneralErrorBooleanWithValue:generalErrorBooleanArgument
                                          completionHandler:^(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_484()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id clusterErrorBooleanArgument;
        clusterErrorBooleanArgument = [NSNumber numberWithBool:false];
        [cluster
            writeAttributeClusterErrorBooleanWithValue:clusterErrorBooleanArgument
                                     completionHandler:^(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_485()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneralErrorBooleanWithCompletionHandler:^(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_486()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClusterErrorBooleanWithCompletionHandler:^(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_487()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(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_488()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeGeneratedCommandListWithCompletionHandler:^(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_489()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id structAttrArgument;
        structAttrArgument = [[MTRTestClusterClusterSimpleStruct alloc] init];
        ((MTRTestClusterClusterSimpleStruct *) structAttrArgument).a = [NSNumber numberWithUnsignedChar:5U];
        ((MTRTestClusterClusterSimpleStruct *) structAttrArgument).b = [NSNumber numberWithBool:true];
        ((MTRTestClusterClusterSimpleStruct *) structAttrArgument).c = [NSNumber numberWithUnsignedChar:2U];
        ((MTRTestClusterClusterSimpleStruct *) structAttrArgument).d = [[NSData alloc] initWithBytes:"abc" length:3];
        ((MTRTestClusterClusterSimpleStruct *) structAttrArgument).e = @"";
        ((MTRTestClusterClusterSimpleStruct *) structAttrArgument).f = [NSNumber numberWithUnsignedChar:17U];
        ((MTRTestClusterClusterSimpleStruct *) structAttrArgument).g = [NSNumber numberWithFloat:1.5f];
        ((MTRTestClusterClusterSimpleStruct *) structAttrArgument).h = [NSNumber numberWithDouble:3.14159265358979];

        [cluster writeAttributeStructAttrWithValue:structAttrArgument
                                 completionHandler:^(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_490()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeStructAttrWithCompletionHandler:^(
            MTRTestClusterClusterSimpleStruct * _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", ((MTRTestClusterClusterSimpleStruct *) actualValue).a, 5U));
                VerifyOrReturn(CheckValue("b", ((MTRTestClusterClusterSimpleStruct *) actualValue).b, true));
                VerifyOrReturn(CheckValue("c", ((MTRTestClusterClusterSimpleStruct *) actualValue).c, 2U));
                VerifyOrReturn(CheckValueAsString(
                    "d", ((MTRTestClusterClusterSimpleStruct *) actualValue).d, [[NSData alloc] initWithBytes:"abc" length:3]));
                VerifyOrReturn(CheckValueAsString("e", ((MTRTestClusterClusterSimpleStruct *) actualValue).e, @""));
                VerifyOrReturn(CheckValue("f", ((MTRTestClusterClusterSimpleStruct *) actualValue).f, 17U));
                VerifyOrReturn(CheckValue("g", ((MTRTestClusterClusterSimpleStruct *) actualValue).g, 1.5f));
                VerifyOrReturn(CheckValue("h", ((MTRTestClusterClusterSimpleStruct *) 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 INT32U Value\n");
            err = TestWriteAttributeInt32uValue_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : Read attribute INT32U Value MinValue Constraints\n");
            err = TestReadAttributeInt32uValueMinValueConstraints_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : Read attribute INT32U Value MaxValue Constraints\n");
            err = TestReadAttributeInt32uValueMaxValueConstraints_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : Read attribute INT32U Value NotValue Constraints\n");
            err = TestReadAttributeInt32uValueNotValueConstraints_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Write attribute INT32U Value Back to Default Value\n");
            err = TestWriteAttributeInt32uValueBackToDefaultValue_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Write attribute CHAR_STRING Value\n");
            err = TestWriteAttributeCharStringValue_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Read attribute CHAR_STRING Value MinLength Constraints\n");
            err = TestReadAttributeCharStringValueMinLengthConstraints_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Read attribute CHAR_STRING Value MaxLength Constraints\n");
            err = TestReadAttributeCharStringValueMaxLengthConstraints_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : Read attribute CHAR_STRING Value StartsWith Constraints\n");
            err = TestReadAttributeCharStringValueStartsWithConstraints_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : Read attribute CHAR_STRING Value EndsWith Constraints\n");
            err = TestReadAttributeCharStringValueEndsWithConstraints_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : Write attribute CHAR_STRING Value\n");
            err = TestWriteAttributeCharStringValue_21();
            break;
        case 22:
            ChipLogProgress(
                chipTool, " ***** Test Step 22 : Read attribute CHAR_STRING Value isLowerCase/isUpperCase Constraints\n");
            err = TestReadAttributeCharStringValueIsLowerCaseIsUpperCaseConstraints_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : Write attribute CHAR_STRING Value\n");
            err = TestWriteAttributeCharStringValue_23();
            break;
        case 24:
            ChipLogProgress(
                chipTool, " ***** Test Step 24 : Read attribute CHAR_STRING Value isLowerCase/isUpperCase Constraints\n");
            err = TestReadAttributeCharStringValueIsLowerCaseIsUpperCaseConstraints_24();
            break;
        case 25:
            ChipLogProgress(chipTool, " ***** Test Step 25 : Write attribute CHAR_STRING Value\n");
            err = TestWriteAttributeCharStringValue_25();
            break;
        case 26:
            ChipLogProgress(
                chipTool, " ***** Test Step 26 : Read attribute CHAR_STRING Value isLowerCase/isUpperCase Constraints\n");
            err = TestReadAttributeCharStringValueIsLowerCaseIsUpperCaseConstraints_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : Write attribute CHAR_STRING Value\n");
            err = TestWriteAttributeCharStringValue_27();
            break;
        case 28:
            ChipLogProgress(chipTool, " ***** Test Step 28 : Read attribute CHAR_STRING Value isHexString Constraints\n");
            err = TestReadAttributeCharStringValueIsHexStringConstraints_28();
            break;
        case 29:
            ChipLogProgress(chipTool, " ***** Test Step 29 : Write attribute CHAR_STRING Value\n");
            err = TestWriteAttributeCharStringValue_29();
            break;
        case 30:
            ChipLogProgress(chipTool, " ***** Test Step 30 : Read attribute CHAR_STRING Value isHexString Constraints\n");
            err = TestReadAttributeCharStringValueIsHexStringConstraints_30();
            break;
        case 31:
            ChipLogProgress(chipTool, " ***** Test Step 31 : Write attribute CHAR_STRING Value Back to Default Value\n");
            err = TestWriteAttributeCharStringValueBackToDefaultValue_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 TestWriteAttributeListWithListOfInt8u_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint: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
                                completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeListInt8uWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeListInt8uWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id listInt8uArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            listInt8uArgument = temp_0;
        }
        [cluster writeAttributeListInt8uWithValue:listInt8uArgument
                                completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap32WithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap32Argument;
        bitmap32Argument = [NSNumber numberWithUnsignedInt:5UL];
        [cluster writeAttributeBitmap32WithValue:bitmap32Argument
                               completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap32WithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap32WithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap32WithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap32WithCompletionHandler:^(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 TestWriteAttributeInt32uValue_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int32uArgument;
        int32uArgument = [NSNumber numberWithUnsignedInt:5UL];
        [cluster writeAttributeInt32uWithValue:int32uArgument
                             completionHandler:^(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_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32uWithCompletionHandler:^(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_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32uWithCompletionHandler:^(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_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32uWithCompletionHandler:^(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_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int32uArgument;
        int32uArgument = [NSNumber numberWithUnsignedInt:0UL];
        [cluster writeAttributeInt32uWithValue:int32uArgument
                             completionHandler:^(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_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id charStringArgument;
        charStringArgument = @"** Test **";
        [cluster writeAttributeCharStringWithValue:charStringArgument
                                 completionHandler:^(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_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletionHandler:^(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_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletionHandler:^(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_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletionHandler:^(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_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletionHandler:^(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_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id charStringArgument;
        charStringArgument = @"lowercase";
        [cluster writeAttributeCharStringWithValue:charStringArgument
                                 completionHandler:^(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_22()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletionHandler:^(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_23()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id charStringArgument;
        charStringArgument = @"UPPERCASE";
        [cluster writeAttributeCharStringWithValue:charStringArgument
                                 completionHandler:^(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_24()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletionHandler:^(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_25()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id charStringArgument;
        charStringArgument = @"lowUPPER";
        [cluster writeAttributeCharStringWithValue:charStringArgument
                                 completionHandler:^(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_26()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletionHandler:^(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_27()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id charStringArgument;
        charStringArgument = @"ABCDEF012V";
        [cluster writeAttributeCharStringWithValue:charStringArgument
                                 completionHandler:^(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_28()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletionHandler:^(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_29()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id charStringArgument;
        charStringArgument = @"ABCDEF0123";
        [cluster writeAttributeCharStringWithValue:charStringArgument
                                 completionHandler:^(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_30()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletionHandler:^(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_31()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id charStringArgument;
        charStringArgument = @"";
        [cluster writeAttributeCharStringWithValue:charStringArgument
                                 completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRTestClusterClusterTestAddArgumentsParams alloc] init];
        params.arg1 = [NSNumber numberWithUnsignedChar:3U];
        params.arg2 = [NSNumber numberWithUnsignedChar:17U];
        [cluster testAddArgumentsWithParams:params
                          completionHandler:^(
                              MTRTestClusterClusterTestAddArgumentsResponseParams * _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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRTestClusterClusterTestAddArgumentsParams alloc] init];
        params.arg1 = [NSNumber numberWithUnsignedChar:3U];
        params.arg2 = [NSNumber numberWithUnsignedChar:17U];
        [cluster testAddArgumentsWithParams:params
                          completionHandler:^(
                              MTRTestClusterClusterTestAddArgumentsResponseParams * _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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRTestClusterClusterTestAddArgumentsParams alloc] init];
        params.arg1 = [NSNumber numberWithUnsignedChar:3U];
        params.arg2 = [TestAddArgumentDefaultValue copy];
        [cluster
            testAddArgumentsWithParams:params
                     completionHandler:^(
                         MTRTestClusterClusterTestAddArgumentsResponseParams * _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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBooleanWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id booleanArgument;
        booleanArgument = [NSNumber numberWithBool:1];
        [cluster writeAttributeBooleanWithValue:booleanArgument
                              completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBooleanWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id booleanArgument;
        booleanArgument = [readAttributeBooleanDefaultValue copy];
        [cluster writeAttributeBooleanWithValue:booleanArgument
                              completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBooleanWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap8WithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap8Argument;
        bitmap8Argument = [NSNumber numberWithUnsignedChar:1U];
        [cluster writeAttributeBitmap8WithValue:bitmap8Argument
                              completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap8WithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap8Argument;
        bitmap8Argument = [readAttributeBitmap8DefaultValue copy];
        [cluster writeAttributeBitmap8WithValue:bitmap8Argument
                              completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap8WithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap16WithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap16Argument;
        bitmap16Argument = [NSNumber numberWithUnsignedShort:1U];
        [cluster writeAttributeBitmap16WithValue:bitmap16Argument
                               completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap16WithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap16Argument;
        bitmap16Argument = [readAttributeBitmap16DefaultValue copy];
        [cluster writeAttributeBitmap16WithValue:bitmap16Argument
                               completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap16WithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap32WithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap32Argument;
        bitmap32Argument = [NSNumber numberWithUnsignedInt:1UL];
        [cluster writeAttributeBitmap32WithValue:bitmap32Argument
                               completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap32WithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap32Argument;
        bitmap32Argument = [readAttributeBitmap32DefaultValue copy];
        [cluster writeAttributeBitmap32WithValue:bitmap32Argument
                               completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap32WithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap64WithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap64Argument;
        bitmap64Argument = [NSNumber numberWithUnsignedLongLong:1ULL];
        [cluster writeAttributeBitmap64WithValue:bitmap64Argument
                               completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap64WithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bitmap64Argument;
        bitmap64Argument = [readAttributeBitmap64DefaultValue copy];
        [cluster writeAttributeBitmap64WithValue:bitmap64Argument
                               completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBitmap64WithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt8uWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int8uArgument;
        int8uArgument = [NSNumber numberWithUnsignedChar:1U];
        [cluster writeAttributeInt8uWithValue:int8uArgument
                            completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt8uWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int8uArgument;
        int8uArgument = [readAttributeInt8uDefaultValue copy];
        [cluster writeAttributeInt8uWithValue:int8uArgument
                            completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt8uWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt16uWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int16uArgument;
        int16uArgument = [NSNumber numberWithUnsignedShort:1U];
        [cluster writeAttributeInt16uWithValue:int16uArgument
                             completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt16uWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int16uArgument;
        int16uArgument = [readAttributeInt16uDefaultValue copy];
        [cluster writeAttributeInt16uWithValue:int16uArgument
                             completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt16uWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32uWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int32uArgument;
        int32uArgument = [NSNumber numberWithUnsignedInt:1UL];
        [cluster writeAttributeInt32uWithValue:int32uArgument
                             completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32uWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int32uArgument;
        int32uArgument = [readAttributeInt32uDefaultValue copy];
        [cluster writeAttributeInt32uWithValue:int32uArgument
                             completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32uWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt64uWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int64uArgument;
        int64uArgument = [NSNumber numberWithUnsignedLongLong:1ULL];
        [cluster writeAttributeInt64uWithValue:int64uArgument
                             completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt64uWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int64uArgument;
        int64uArgument = [readAttributeInt64uDefaultValue copy];
        [cluster writeAttributeInt64uWithValue:int64uArgument
                             completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt64uWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt8sWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int8sArgument;
        int8sArgument = [NSNumber numberWithChar:1];
        [cluster writeAttributeInt8sWithValue:int8sArgument
                            completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt8sWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int8sArgument;
        int8sArgument = [readAttributeInt8sDefaultValue copy];
        [cluster writeAttributeInt8sWithValue:int8sArgument
                            completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt8sWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt16sWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int16sArgument;
        int16sArgument = [NSNumber numberWithShort:1];
        [cluster writeAttributeInt16sWithValue:int16sArgument
                             completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt16sWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int16sArgument;
        int16sArgument = [readAttributeInt16sDefaultValue copy];
        [cluster writeAttributeInt16sWithValue:int16sArgument
                             completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt16sWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32sWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int32sArgument;
        int32sArgument = [NSNumber numberWithInt:1L];
        [cluster writeAttributeInt32sWithValue:int32sArgument
                             completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32sWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int32sArgument;
        int32sArgument = [readAttributeInt32sDefaultValue copy];
        [cluster writeAttributeInt32sWithValue:int32sArgument
                             completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt32sWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt64sWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int64sArgument;
        int64sArgument = [NSNumber numberWithLongLong:1LL];
        [cluster writeAttributeInt64sWithValue:int64sArgument
                             completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt64sWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id int64sArgument;
        int64sArgument = [readAttributeInt64sDefaultValue copy];
        [cluster writeAttributeInt64sWithValue:int64sArgument
                             completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeInt64sWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnum8WithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id enum8Argument;
        enum8Argument = [NSNumber numberWithUnsignedChar:1U];
        [cluster writeAttributeEnum8WithValue:enum8Argument
                            completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnum8WithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id enum8Argument;
        enum8Argument = [readAttributeEnum8DefaultValue copy];
        [cluster writeAttributeEnum8WithValue:enum8Argument
                            completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnum8WithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnum16WithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id enum16Argument;
        enum16Argument = [NSNumber numberWithUnsignedShort:1U];
        [cluster writeAttributeEnum16WithValue:enum16Argument
                             completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnum16WithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id enum16Argument;
        enum16Argument = [readAttributeEnum16DefaultValue copy];
        [cluster writeAttributeEnum16WithValue:enum16Argument
                             completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEnum16WithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEpochUsWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id epochUsArgument;
        epochUsArgument = [NSNumber numberWithUnsignedLongLong:1ULL];
        [cluster writeAttributeEpochUsWithValue:epochUsArgument
                              completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEpochUsWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id epochUsArgument;
        epochUsArgument = [readAttributeEpochUSDefaultValue copy];
        [cluster writeAttributeEpochUsWithValue:epochUsArgument
                              completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEpochUsWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEpochSWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id epochSArgument;
        epochSArgument = [NSNumber numberWithUnsignedInt:1UL];
        [cluster writeAttributeEpochSWithValue:epochSArgument
                             completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEpochSWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id epochSArgument;
        epochSArgument = [readAttributeEpochSDefaultValue copy];
        [cluster writeAttributeEpochSWithValue:epochSArgument
                             completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeEpochSWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeVendorIdWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id vendorIdArgument;
        vendorIdArgument = [NSNumber numberWithUnsignedShort:1U];
        [cluster writeAttributeVendorIdWithValue:vendorIdArgument
                               completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeVendorIdWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id vendorIdArgument;
        vendorIdArgument = [readAttributeVendorIdDefaultValue copy];
        [cluster writeAttributeVendorIdWithValue:vendorIdArgument
                               completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeVendorIdWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id charStringArgument;
        charStringArgument = @"NotDefault";
        [cluster writeAttributeCharStringWithValue:charStringArgument
                                 completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id charStringArgument;
        charStringArgument = [readAttributeCharStringNotDefaultValue copy];
        [cluster writeAttributeCharStringWithValue:charStringArgument
                                 completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCharStringWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id charStringArgument;
        charStringArgument = [readAttributeCharStringDefaultValue copy];
        [cluster writeAttributeCharStringWithValue:charStringArgument
                                 completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOctetStringWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOctetStringWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id octetStringArgument;
        octetStringArgument = [[NSData alloc] initWithBytes:"NotDefault" length:10];
        [cluster writeAttributeOctetStringWithValue:octetStringArgument
                                  completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOctetStringWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOctetStringWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id octetStringArgument;
        octetStringArgument = [readAttributeOctetStringNotDefaultValue copy];
        [cluster writeAttributeOctetStringWithValue:octetStringArgument
                                  completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOctetStringWithCompletionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id octetStringArgument;
        octetStringArgument = [readAttributeOctetStringDefaultValue copy];
        [cluster writeAttributeOctetStringWithValue:octetStringArgument
                                  completionHandler:^(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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRTestClusterClusterTestAddArgumentsParams alloc] init];
        params.arg1 = [NSNumber numberWithUnsignedChar:3U];
        params.arg2 = [NSNumber numberWithUnsignedChar:17U];
        [cluster testAddArgumentsWithParams:params
                          completionHandler:^(
                              MTRTestClusterClusterTestAddArgumentsResponseParams * _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");
        MTRBaseClusterTestCluster * cluster = [[MTRBaseClusterTestCluster alloc] initWithDevice:device
                                                                                       endpoint:1
                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRTestClusterClusterTestAddArgumentsParams alloc] init];
        params.arg1 = mArg1.HasValue() ? [NSNumber numberWithUnsignedChar:mArg1.Value()] : [NSNumber numberWithUnsignedChar:5U];
        params.arg2 = [TestAddArgumentDefaultValue copy];
        [cluster testAddArgumentsWithParams:params
                          completionHandler:^(
                              MTRTestClusterClusterTestAddArgumentsResponseParams * _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");
        MTRBaseClusterDescriptor * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
                                                                                     endpoint:0
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeDeviceListWithCompletionHandler:^(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("device list", [actualValue count], static_cast<uint32_t>(1)));
                VerifyOrReturn(CheckValue("type", ((MTRDescriptorClusterDeviceType *) actualValue[0]).type, 22UL));
                VerifyOrReturn(CheckValue("revision", ((MTRDescriptorClusterDeviceType *) actualValue[0]).revision, 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeServerList_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDescriptor * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
                                                                                     endpoint:0
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeServerListWithCompletionHandler:^(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("server list", [actualValue count], static_cast<uint32_t>(26)));
                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));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadAttributeClientList_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDescriptor * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
                                                                                     endpoint:0
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeClientListWithCompletionHandler:^(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("client list", [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");
        MTRBaseClusterDescriptor * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
                                                                                     endpoint:0
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePartsListWithCompletionHandler:^(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("parts list", [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");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLocationWithCompletionHandler:^(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");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id locationArgument;
        locationArgument = @"US";
        [cluster writeAttributeLocationWithValue:locationArgument
                               completionHandler:^(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");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLocationWithCompletionHandler:^(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");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id locationArgument;
        locationArgument = @"XX";
        [cluster writeAttributeLocationWithValue:locationArgument
                               completionHandler:^(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");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAttributeListWithCompletionHandler:^(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");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNodeLabelWithCompletionHandler:^(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");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nodeLabelArgument;
        nodeLabelArgument = @"My node";
        [cluster writeAttributeNodeLabelWithValue:nodeLabelArgument
                                completionHandler:^(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");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNodeLabelWithCompletionHandler:^(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");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLocalConfigDisabledWithCompletionHandler:^(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");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id localConfigDisabledArgument;
        localConfigDisabledArgument = [NSNumber numberWithBool:true];
        [cluster writeAttributeLocalConfigDisabledWithValue:localConfigDisabledArgument
                                          completionHandler:^(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");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLocalConfigDisabledWithCompletionHandler:^(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");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNodeLabelWithCompletionHandler:^(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");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nodeLabelArgument;
        nodeLabelArgument = @"";
        [cluster writeAttributeNodeLabelWithValue:nodeLabelArgument
                                completionHandler:^(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");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLocalConfigDisabledWithCompletionHandler:^(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");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id localConfigDisabledArgument;
        localConfigDisabledArgument = [NSNumber numberWithBool:false];
        [cluster writeAttributeLocalConfigDisabledWithValue:localConfigDisabledArgument
                                          completionHandler:^(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");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCommissionedFabricsWithCompletionHandler:^(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");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentFabricIndexWithCompletionHandler:^(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");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRAdministratorCommissioningClusterOpenBasicCommissioningWindowParams alloc] init];
        params.commissioningTimeout = [NSNumber numberWithUnsignedShort:180U];
        [cluster openBasicCommissioningWindowWithParams:params
                                      completionHandler:^(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");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpoint: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");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        uint16_t minIntervalArgument = 2U;
        uint16_t maxIntervalArgument = 5U;
        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] init];
        [cluster subscribeAttributeFabricsWithMinInterval:[NSNumber numberWithUnsignedInt:minIntervalArgument]
            maxInterval:[NSNumber numberWithUnsignedInt:maxIntervalArgument]
            params: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");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTROperationalCredentialsClusterRemoveFabricParams alloc] init];
        params.fabricIndex = [ourFabricIndex copy];
        [cluster removeFabricWithParams:params
                      completionHandler:^(
                          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");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                         endpoint:0
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id breadcrumbArgument;
        breadcrumbArgument = [NSNumber numberWithUnsignedLongLong:137438953472ULL];
        [cluster writeAttributeBreadcrumbWithValue:breadcrumbArgument
                                 completionHandler:^(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");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                         endpoint:0
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBreadcrumbWithCompletionHandler:^(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");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                         endpoint:0
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id breadcrumbArgument;
        breadcrumbArgument = [NSNumber numberWithUnsignedLongLong:81ULL];
        [cluster writeAttributeBreadcrumbWithValue:breadcrumbArgument
                                 completionHandler:^(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");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                         endpoint:0
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBreadcrumbWithCompletionHandler:^(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");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                         endpoint:0
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBreadcrumbWithCompletionHandler:^(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");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                         endpoint:0
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id breadcrumbArgument;
        breadcrumbArgument = [NSNumber numberWithUnsignedLongLong:1ULL];
        [cluster writeAttributeBreadcrumbWithValue:breadcrumbArgument
                                 completionHandler:^(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");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                         endpoint:0
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBreadcrumbWithCompletionHandler:^(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");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                         endpoint:0
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster commissioningCompleteWithCompletionHandler:^(
            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");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                         endpoint:0
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBreadcrumbWithCompletionHandler:^(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");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRAdministratorCommissioningClusterOpenBasicCommissioningWindowParams alloc] init];
        params.commissioningTimeout = [NSNumber numberWithUnsignedShort:180U];
        [cluster openBasicCommissioningWindowWithParams:params
                                      completionHandler:^(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");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                         endpoint: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
                     completionHandler:^(
                         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");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                         endpoint:0
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBreadcrumbWithCompletionHandler:^(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");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                         endpoint:0
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id breadcrumbArgument;
        breadcrumbArgument = [NSNumber numberWithUnsignedLongLong:0ULL];
        [cluster writeAttributeBreadcrumbWithValue:breadcrumbArgument
                                 completionHandler:^(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");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                         endpoint: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
                     completionHandler:^(
                         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");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                         endpoint:0
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBreadcrumbWithCompletionHandler:^(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");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                         endpoint: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
                     completionHandler:^(
                         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");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                         endpoint:0
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBreadcrumbWithCompletionHandler:^(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");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                         endpoint:0
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster commissioningCompleteWithCompletionHandler:^(
            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");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                         endpoint:0
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBreadcrumbWithCompletionHandler:^(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");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                         endpoint:0
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster commissioningCompleteWithCompletionHandler:^(
            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");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                         endpoint:0
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBreadcrumbWithCompletionHandler:^(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");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                         endpoint: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
                     completionHandler:^(
                         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");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                         endpoint:0
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBreadcrumbWithCompletionHandler:^(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");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                         endpoint: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
                     completionHandler:^(
                         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");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                         endpoint:0
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeBreadcrumbWithCompletionHandler:^(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");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                         endpoint:0
                                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeSupportsConcurrentConnectionWithCompletionHandler:^(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");
        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRIdentifyClusterIdentifyParams alloc] init];
        params.identifyTime = [NSNumber numberWithUnsignedShort:0U];
        [cluster identifyWithParams:params
                  completionHandler:^(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");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSupportedFabricsWithCompletionHandler:^(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");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCommissionedFabricsWithCompletionHandler:^(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");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentFabricIndexWithCompletionHandler:^(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");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTROperationalCredentialsClusterRemoveFabricParams alloc] init];
        params.fabricIndex = [NSNumber numberWithUnsignedChar:243U];
        [cluster removeFabricWithParams:params
                      completionHandler:^(
                          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");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        MTRReadParams * params = [[MTRReadParams alloc] init];
        params.fabricFiltered = [NSNumber numberWithBool:true];
        [cluster readAttributeFabricsWithParams:params
                              completionHandler:^(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");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTROperationalCredentialsClusterUpdateFabricLabelParams alloc] init];
        params.label = @"Batcave";
        [cluster updateFabricLabelWithParams:params
                           completionHandler:^(
                               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");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        MTRReadParams * params = [[MTRReadParams alloc] init];
        params.fabricFiltered = [NSNumber numberWithBool:true];
        [cluster readAttributeFabricsWithParams:params
                              completionHandler:^(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");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeDescriptionWithCompletionHandler:^(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");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeStandardNamespaceWithCompletionHandler:^(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");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSupportedModesWithCompletionHandler:^(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(
                    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(
                    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(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");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentModeWithCompletionHandler:^(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");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeStartUpModeWithCompletionHandler:^(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");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnModeWithCompletionHandler:^(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");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRModeSelectClusterChangeToModeParams alloc] init];
        params.newMode = [NSNumber numberWithUnsignedChar:4U];
        [cluster changeToModeWithParams:params
                      completionHandler:^(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");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentModeWithCompletionHandler:^(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");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRModeSelectClusterChangeToModeParams alloc] init];
        params.newMode = [NSNumber numberWithUnsignedChar:2U];
        [cluster
            changeToModeWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletionHandler:^(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");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentModeWithCompletionHandler:^(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");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id onModeArgument;
        onModeArgument = [NSNumber numberWithUnsignedChar:2U];
        [cluster
            writeAttributeOnModeWithValue:onModeArgument
                        completionHandler:^(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");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id onModeArgument;
        onModeArgument = [NSNumber numberWithUnsignedChar:7U];
        [cluster writeAttributeOnModeWithValue:onModeArgument
                             completionHandler:^(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");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnModeWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletionHandler:^(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");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentModeWithCompletionHandler:^(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");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id startUpModeArgument;
        startUpModeArgument = [NSNumber numberWithUnsignedChar:2U];
        [cluster writeAttributeStartUpModeWithValue:startUpModeArgument
                                  completionHandler:^(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");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id startUpModeArgument;
        startUpModeArgument = [NSNumber numberWithUnsignedChar:7U];
        [cluster writeAttributeStartUpModeWithValue:startUpModeArgument
                                  completionHandler:^(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");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeStartUpModeWithCompletionHandler:^(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");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRModeSelectClusterChangeToModeParams alloc] init];
        params.newMode = [NSNumber numberWithUnsignedChar:0U];
        [cluster changeToModeWithParams:params
                      completionHandler:^(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");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id onModeArgument;
        onModeArgument = [NSNumber numberWithUnsignedChar:4U];
        [cluster writeAttributeOnModeWithValue:onModeArgument
                             completionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id startUpOnOffArgument;
        startUpOnOffArgument = [NSNumber numberWithUnsignedChar:1U];
        [cluster writeAttributeStartUpOnOffWithValue:startUpOnOffArgument
                                   completionHandler:^(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");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentModeWithCompletionHandler:^(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");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id onModeArgument;
        onModeArgument = nil;
        [cluster writeAttributeOnModeWithValue:onModeArgument
                             completionHandler:^(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");
        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentModeWithCompletionHandler:^(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");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCommissionedFabricsWithCompletionHandler:^(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");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentFabricIndexWithCompletionHandler:^(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");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTROperationalCredentialsClusterRemoveFabricParams alloc] init];
        params.fabricIndex = [ourFabricIndex copy];
        [cluster removeFabricWithParams:params
                      completionHandler:^(
                          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");
        MTRBaseClusterBinding * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id bindingArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            bindingArgument = temp_0;
        }
        [cluster writeAttributeBindingWithValue:bindingArgument
                              completionHandler:^(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");
        MTRBaseClusterBinding * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        MTRReadParams * params = [[MTRReadParams alloc] init];
        params.fabricFiltered = [NSNumber numberWithBool:true];
        [cluster readAttributeBindingWithParams:params
                              completionHandler:^(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");
        MTRBaseClusterBinding * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device endpoint: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
                              completionHandler:^(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");
        MTRBaseClusterBinding * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device endpoint: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
                              completionHandler:^(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");
        MTRBaseClusterBinding * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        MTRReadParams * params = [[MTRReadParams alloc] init];
        params.fabricFiltered = [NSNumber numberWithBool:true];
        [cluster
            readAttributeBindingWithParams:params
                         completionHandler:^(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");
        MTRBaseClusterBinding * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device endpoint: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
                              completionHandler:^(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");
        MTRBaseClusterBinding * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        MTRReadParams * params = [[MTRReadParams alloc] init];
        params.fabricFiltered = [NSNumber numberWithBool:true];
        [cluster
            readAttributeBindingWithParams:params
                         completionHandler:^(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");
        MTRBaseClusterBinding * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        MTRReadParams * params = [[MTRReadParams alloc] init];
        params.fabricFiltered = [NSNumber numberWithBool:true];
        [cluster
            readAttributeBindingWithParams:params
                         completionHandler:^(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");
        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpoint: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
                                completionHandler:^(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");
        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLabelListWithCompletionHandler:^(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");
        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id labelListArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            labelListArgument = temp_0;
        }
        [cluster writeAttributeLabelListWithValue:labelListArgument
                                completionHandler:^(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");
        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLabelListWithCompletionHandler:^(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");
        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpoint: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
                                completionHandler:^(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");
        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLabelListWithCompletionHandler:^(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");
        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpoint: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
                                completionHandler:^(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");
        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpoint: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
                                completionHandler:^(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");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        MTRReadParams * params = [[MTRReadParams alloc] init];
        params.fabricFiltered = [NSNumber numberWithBool:true];
        [cluster readAttributeFabricsWithParams:params
                              completionHandler:^(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(CheckValueAsString("Label",
                                          ((MTROperationalCredentialsClusterFabricDescriptor *) actualValue[0]).label, @""));
                                  }

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

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestArmFailSafeOnTargetDeviceWithTimeout0_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
                                                                                                         endpoint: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
                     completionHandler:^(
                         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");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNodeLabelWithCompletionHandler:^(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");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpoint: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
                                   completionHandler:^(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");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpoint: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
                completionHandler:^(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");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpoint: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
              completionHandler:^(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");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpoint: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
               completionHandler:^(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");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id fanModeArgument;
        fanModeArgument = [NSNumber numberWithUnsignedChar:3U];
        [cluster writeAttributeFanModeWithValue:fanModeArgument
                              completionHandler:^(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");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFanModeWithCompletionHandler:^(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");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id fanModeSequenceArgument;
        fanModeSequenceArgument = [NSNumber numberWithUnsignedChar:5U];
        [cluster writeAttributeFanModeSequenceWithValue:fanModeSequenceArgument
                                      completionHandler:^(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");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeFanModeSequenceWithCompletionHandler:^(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");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id percentSettingArgument;
        percentSettingArgument = [NSNumber numberWithUnsignedChar:84U];
        [cluster writeAttributePercentSettingWithValue:percentSettingArgument
                                     completionHandler:^(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");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePercentSettingWithCompletionHandler:^(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");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSpeedSettingWithCompletionHandler:^(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");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSpeedCurrentWithCompletionHandler:^(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");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id percentSettingArgument;
        percentSettingArgument = nil;
        [cluster writeAttributePercentSettingWithValue:percentSettingArgument
                                     completionHandler:^(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");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePercentSettingWithCompletionHandler:^(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");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id speedSettingArgument;
        speedSettingArgument = [NSNumber numberWithUnsignedChar:73U];
        [cluster writeAttributeSpeedSettingWithValue:speedSettingArgument
                                   completionHandler:^(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");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSpeedSettingWithCompletionHandler:^(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");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePercentSettingWithCompletionHandler:^(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");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePercentCurrentWithCompletionHandler:^(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");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id speedSettingArgument;
        speedSettingArgument = nil;
        [cluster writeAttributeSpeedSettingWithValue:speedSettingArgument
                                   completionHandler:^(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");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSpeedSettingWithCompletionHandler:^(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");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id fanModeArgument;
        fanModeArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeFanModeWithValue:fanModeArgument
                              completionHandler:^(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");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePercentSettingWithCompletionHandler:^(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");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePercentCurrentWithCompletionHandler:^(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");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSpeedSettingWithCompletionHandler:^(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");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSpeedCurrentWithCompletionHandler:^(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");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id fanModeArgument;
        fanModeArgument = [NSNumber numberWithUnsignedChar:5U];
        [cluster writeAttributeFanModeWithValue:fanModeArgument
                              completionHandler:^(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");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributePercentSettingWithCompletionHandler:^(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");
        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
                                                                                     endpoint:1
                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeSpeedSettingWithCompletionHandler:^(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");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                           endpoint: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
                     completionHandler:^(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");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                           endpoint: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
                     completionHandler:^(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");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                           endpoint: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
                     completionHandler:^(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");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                           endpoint: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
                     completionHandler:^(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");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                           endpoint: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
                     completionHandler:^(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");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                           endpoint: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
                     completionHandler:^(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");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                           endpoint: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
                     completionHandler:^(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");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                           endpoint: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
                     completionHandler:^(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");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                           endpoint: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
                     completionHandler:^(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");
        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
                                                                                           endpoint: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
                     completionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint: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
                     completionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id onOffTransitionTimeArgument;
        onOffTransitionTimeArgument = [NSNumber numberWithUnsignedShort:0U];
        [cluster writeAttributeOnOffTransitionTimeWithValue:onOffTransitionTimeArgument
                                          completionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffTransitionTimeWithCompletionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id onLevelArgument;
        onLevelArgument = [NSNumber numberWithUnsignedChar:254U];
        [cluster writeAttributeOnLevelWithValue:onLevelArgument
                              completionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnLevelWithCompletionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMinLevelWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint: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
                     completionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id onLevelArgument;
        onLevelArgument = nil;
        [cluster writeAttributeOnLevelWithValue:onLevelArgument
                              completionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnLevelWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeOnOffWithCompletionHandler:^(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");
        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
                                                                                         endpoint:1
                                                                                            queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentLevelWithCompletionHandler:^(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("alphaIndex", 0, UINT8_MAX, &mAlphaIndex);
        AddArgument("betaIndex", 0, UINT8_MAX, &mBetaIndex);
        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<uint8_t> mAlphaIndex;
    chip::Optional<uint8_t> mBetaIndex;
    chip::Optional<uint16_t> mTimeout;

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

    CHIP_ERROR TestGetAlphasFabricIndex_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentFabricIndexWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Get alpha's fabric index Error: %@", err);

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

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentFabricIndex", actualValue, mAlphaIndex.HasValue() ? mAlphaIndex.Value() : 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckThatCommissioningWindowIsNotOpen_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeWindowStatusWithCompletionHandler:^(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");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAdminFabricIndexWithCompletionHandler:^(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");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAdminVendorIdWithCompletionHandler:^(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");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRAdministratorCommissioningClusterOpenBasicCommissioningWindowParams alloc] init];
        params.commissioningTimeout = [NSNumber numberWithUnsignedShort:180U];
        [cluster openBasicCommissioningWindowWithParams:params
                                      completionHandler:^(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");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeWindowStatusWithCompletionHandler:^(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");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAdminFabricIndexWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check the AdminFabricIndex Error: %@", err);

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

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("AdminFabricIndex", actualValue));
                VerifyOrReturn(CheckValue("AdminFabricIndex", actualValue, mAlphaIndex.HasValue() ? mAlphaIndex.Value() : 1U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCheckTheAdminVendorIdIsNotNull_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAdminVendorIdWithCompletionHandler:^(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");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster revokeCommissioningWithCompletionHandler:^(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");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeWindowStatusWithCompletionHandler:^(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");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAdminFabricIndexWithCompletionHandler:^(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");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAdminVendorIdWithCompletionHandler:^(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");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRAdministratorCommissioningClusterOpenBasicCommissioningWindowParams alloc] init];
        params.commissioningTimeout = [NSNumber numberWithUnsignedShort:180U];
        [cluster openBasicCommissioningWindowWithParams:params
                                      completionHandler:^(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");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeWindowStatusWithCompletionHandler:^(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");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAdminFabricIndexWithCompletionHandler:^(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");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAdminVendorIdWithCompletionHandler:^(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;
    }

    CHIP_ERROR TestGetBetasFabricIndex_19()
    {
        MTRBaseDevice * device = GetDevice("beta");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentFabricIndexWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Get beta's fabric index Error: %@", err);

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

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("CurrentFabricIndex", actualValue, mBetaIndex.HasValue() ? mBetaIndex.Value() : 2U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestOpenCommissioningWindowFromBeta_20()
    {
        MTRBaseDevice * device = GetDevice("beta");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRAdministratorCommissioningClusterOpenBasicCommissioningWindowParams alloc] init];
        params.commissioningTimeout = [NSNumber numberWithUnsignedShort:180U];
        [cluster openBasicCommissioningWindowWithParams:params
                                      completionHandler:^(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");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeWindowStatusWithCompletionHandler:^(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");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAdminFabricIndexWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Check the AdminFabricIndex again Error: %@", err);

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

            {
                id actualValue = value;
                VerifyOrReturn(CheckValueNonNull("AdminFabricIndex", actualValue));
                VerifyOrReturn(CheckValue("AdminFabricIndex", actualValue, mBetaIndex.HasValue() ? mBetaIndex.Value() : 2U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
    NSNumber * _Nullable adminVendorId;

    CHIP_ERROR TestCheckTheAdminVendorIdIsNotNullAgain_23()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAdminVendorIdWithCompletionHandler:^(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");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTROperationalCredentialsClusterRemoveFabricParams alloc] init];
        params.fabricIndex
            = mBetaIndex.HasValue() ? [NSNumber numberWithUnsignedChar:mBetaIndex.Value()] : [NSNumber numberWithUnsignedChar:2U];
        [cluster removeFabricWithParams:params
                      completionHandler:^(
                          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");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeWindowStatusWithCompletionHandler:^(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");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAdminFabricIndexWithCompletionHandler:^(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");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAdminVendorIdWithCompletionHandler:^(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));
            VerifyOrReturn(CheckValue("clusterStatus present", status.mClusterStatus.HasValue(), true));
            VerifyOrReturn(CheckValue("clusterStatus value", status.mClusterStatus.Value(), 9));
            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");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRAdministratorCommissioningClusterOpenBasicCommissioningWindowParams alloc] init];
        params.commissioningTimeout = [NSNumber numberWithUnsignedShort:180U];
        [cluster openBasicCommissioningWindowWithParams:params
                                      completionHandler:^(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");
        MTRBaseClusterOperationalCredentials * cluster =
            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        MTRReadParams * params = [[MTRReadParams alloc] init];
        params.fabricFiltered = [NSNumber numberWithBool:false];
        [cluster readAttributeFabricsWithParams:params
                              completionHandler:^(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)));
                                  }

                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCloseCommissioningWindowAfterFailedCommissioning_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster revokeCommissioningWithCompletionHandler:^(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");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRAdministratorCommissioningClusterOpenBasicCommissioningWindowParams alloc] init];
        params.commissioningTimeout = [NSNumber numberWithUnsignedShort:180U];
        [cluster openBasicCommissioningWindowWithParams:params
                                      completionHandler:^(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");
        MTRBaseClusterAdministratorCommissioning * cluster =
            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRAdministratorCommissioningClusterOpenBasicCommissioningWindowParams alloc] init];
        params.commissioningTimeout = [NSNumber numberWithUnsignedShort:180U];
        [cluster openBasicCommissioningWindowWithParams:params
                                      completionHandler:^(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");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNodeLabelWithCompletionHandler:^(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");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nodeLabelArgument;
        nodeLabelArgument = @"written from beta";
        [cluster writeAttributeNodeLabelWithValue:nodeLabelArgument
                                completionHandler:^(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");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNodeLabelWithCompletionHandler:^(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");
        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpoint:0 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id nodeLabelArgument;
        nodeLabelArgument = [readFromAlpha copy];
        [cluster writeAttributeNodeLabelWithValue:nodeLabelArgument
                                completionHandler:^(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_2_1 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_DGSW_2_1()
        : TestCommandBridge("Test_TC_DGSW_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_DGSW_2_1() {}

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

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

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_DGSW_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 a list of ThreadMetrics struct non-global attribute from DUT.\n");
            if (ShouldSkip("DGSW.S.A0000")) {
                NextTest();
                return;
            }
            err = TestReadsAListOfThreadMetricsStructNonGlobalAttributeFromDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Reads CurrentHeapFree non-global attribute value from DUT\n");
            if (ShouldSkip("DGSW.S.A0001")) {
                NextTest();
                return;
            }
            err = TestReadsCurrentHeapFreeNonGlobalAttributeValueFromDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Reads CurrentHeapUsed non-global attribute value from DUT\n");
            if (ShouldSkip("DGSW.S.A0002")) {
                NextTest();
                return;
            }
            err = TestReadsCurrentHeapUsedNonGlobalAttributeValueFromDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Reads CurrentHeapHighWaterMark non-global attribute value from DUT\n");
            if (ShouldSkip("DGSW.S.A0003")) {
                NextTest();
                return;
            }
            err = TestReadsCurrentHeapHighWaterMarkNonGlobalAttributeValueFromDut_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 TestReadsAListOfThreadMetricsStructNonGlobalAttributeFromDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
                                                                                                       endpoint:0
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeThreadMetricsWithCompletionHandler:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads a list of ThreadMetrics struct non-global attribute from DUT. Error: %@", err);

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

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

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsCurrentHeapFreeNonGlobalAttributeValueFromDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
                                                                                                       endpoint:0
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentHeapFreeWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads CurrentHeapFree non-global attribute value from DUT Error: %@", err);

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

            VerifyOrReturn(CheckConstraintType("currentHeapFree", "int64u", "int64u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsCurrentHeapUsedNonGlobalAttributeValueFromDut_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
                                                                                                       endpoint:0
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentHeapUsedWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads CurrentHeapUsed non-global attribute value from DUT Error: %@", err);

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

            VerifyOrReturn(CheckConstraintType("currentHeapUsed", "int64u", "int64u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsCurrentHeapHighWaterMarkNonGlobalAttributeValueFromDut_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
                                                                                                       endpoint:0
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentHeapHighWatermarkWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads CurrentHeapHighWaterMark non-global attribute value from DUT Error: %@", err);

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

            VerifyOrReturn(CheckConstraintType("currentHeapHighWatermark", "int64u", "int64u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }
};

class Test_TC_DGSW_2_2 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_DGSW_2_2()
        : TestCommandBridge("Test_TC_DGSW_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_DGSW_2_2() {}

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

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

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_DGSW_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 a list of SoftwareFault struct from DUT and data type in each field of the struct must "
                "match the value listed in spec\n");
            if (ShouldSkip("PICS_USER_PROMPT && DGSW.S.E00")) {
                NextTest();
                return;
            }
            err = TestReadsAListOfSoftwareFaultStructFromDutAndDataTypeInEachFieldOfTheStructMustMatchTheValueListedInSpec_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 TestReadsAListOfSoftwareFaultStructFromDutAndDataTypeInEachFieldOfTheStructMustMatchTheValueListedInSpec_1()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter '0' for successgarbage: not in length on purpose", 28);
        value.expectedValue.Emplace();
        value.expectedValue.Value() = chip::Span<const char>("0garbage: not in length on purpose", 1);
        return UserPrompt("alpha", value);
    }
};

class Test_TC_DGSW_2_3 : public TestCommandBridge {
public:
    // NOLINTBEGIN(clang-analyzer-nullability.NullPassedToNonnull): Test constructor nullability not enforced
    Test_TC_DGSW_2_3()
        : TestCommandBridge("Test_TC_DGSW_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_DGSW_2_3() {}

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

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

        if (mTestCount == mTestIndex) {
            ChipLogProgress(chipTool, " **** Test Complete: Test_TC_DGSW_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 : Sends ResetWatermarks to DUT\n");
            if (ShouldSkip("DGSW.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestSendsResetWatermarksToDut_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Reads a list of ThreadMetrics struct attribute from DUT.\n");
            if (ShouldSkip("DGSW.S.A0001")) {
                NextTest();
                return;
            }
            err = TestReadsAListOfThreadMetricsStructAttributeFromDut_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : Reads CurrentHeapUsed attribute value from DUT\n");
            if (ShouldSkip("DGSW.S.A0002")) {
                NextTest();
                return;
            }
            err = TestReadsCurrentHeapUsedAttributeValueFromDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : Reads CurrentHeapHighWaterMark attribute value from DUT\n");
            if (ShouldSkip("DGSW.S.A0003")) {
                NextTest();
                return;
            }
            err = TestReadsCurrentHeapHighWaterMarkAttributeValueFromDut_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 TestSendsResetWatermarksToDut_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
                                                                                                       endpoint:0
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster resetWatermarksWithCompletionHandler:^(NSError * _Nullable err) {
            NSLog(@"Sends ResetWatermarks to DUT Error: %@", err);

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsAListOfThreadMetricsStructAttributeFromDut_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
                                                                                                       endpoint:0
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeThreadMetricsWithCompletionHandler:^(NSArray * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads a list of ThreadMetrics struct attribute from DUT. Error: %@", err);

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

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

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsCurrentHeapUsedAttributeValueFromDut_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
                                                                                                       endpoint:0
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentHeapUsedWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads CurrentHeapUsed attribute value from DUT Error: %@", err);

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

            VerifyOrReturn(CheckConstraintType("currentHeapUsed", "int64u", "int64u"));
            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadsCurrentHeapHighWaterMarkAttributeValueFromDut_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
                                                                                                       endpoint:0
                                                                                                          queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeCurrentHeapHighWatermarkWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Reads CurrentHeapHighWaterMark attribute value from DUT Error: %@", err);

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

            VerifyOrReturn(CheckConstraintType("currentHeapHighWatermark", "int64u", "int64u"));
            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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint: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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        uint16_t minIntervalArgument = 2U;
        uint16_t maxIntervalArgument = 5U;
        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] init];
        [cluster subscribeAttributeOnOffWithMinInterval:[NSNumber numberWithUnsignedInt:minIntervalArgument]
            maxInterval:[NSNumber numberWithUnsignedInt:maxIntervalArgument]
            params: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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster onWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint: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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster offWithCompletionHandler:^(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");
        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpoint: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 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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeNumberOfTotalUsersSupportedWithCompletionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:0U];
        [cluster getUserWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:2U];
        [cluster getUserWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:3U];
        [cluster getUserWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:3U];
        [cluster getUserWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:3U];
        [cluster getUserWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NumberOfTotalUsersSupported copy];
        [cluster getUserWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster clearUserWithParams:params
                   completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:0U];
        [cluster clearUserWithParams:params
                   completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                   completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:65534U];
        [cluster clearUserWithParams:params
                   completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:2U];
        [cluster getUserWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NumberOfTotalUsersSupported copy];
        [cluster getUserWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeNumberOfPINUsersSupportedWithCompletionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                             completionHandler:^(
                                 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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                             completionHandler:^(
                                 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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                             completionHandler:^(
                                 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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                             completionHandler:^(
                                 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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeNumberOfRFIDUsersSupportedWithCompletionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                             completionHandler:^(
                                 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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                             completionHandler:^(
                                 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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                             completionHandler:^(
                                 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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                             completionHandler:^(
                                 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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster
            getUserWithParams:params
            completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster
            getUserWithParams:params
            completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                         completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                             completionHandler:^(
                                 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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster
            getUserWithParams:params
            completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                         completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                             completionHandler:^(
                                 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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:2U];
        [cluster getUserWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                         completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                             completionHandler:^(
                                 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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                             completionHandler:^(
                                 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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                             completionHandler:^(
                                 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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:2U];
        [cluster getUserWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
        params.credential = nil;
        [cluster clearCredentialWithParams:params
                         completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                             completionHandler:^(
                                 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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                             completionHandler:^(
                                 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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                             completionHandler:^(
                                 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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:2U];
        [cluster getUserWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:3U];
        [cluster getUserWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:4U];
        [cluster getUserWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                             completionHandler:^(
                                 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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                    completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                    completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                    completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                    completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                    completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                    completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster clearUserWithParams:params
                   completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                             completionHandler:^(
                                 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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster clearUserWithParams:params
                   completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
        [cluster unlockDoorWithParams:params
                    completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLockStateWithCompletionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterLockDoorParams alloc] init];
        [cluster lockDoorWithParams:params
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLockStateWithCompletionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id wrongCodeEntryLimitArgument;
        wrongCodeEntryLimitArgument = [NSNumber numberWithUnsignedChar:20U];
        [cluster writeAttributeWrongCodeEntryLimitWithValue:wrongCodeEntryLimitArgument
                                          completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
               completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLockStateWithCompletionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                    completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLockStateWithCompletionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLockStateWithCompletionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLockStateWithCompletionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id operatingModeArgument;
        operatingModeArgument = [NSNumber numberWithUnsignedChar:3U];
        [cluster writeAttributeOperatingModeWithValue:operatingModeArgument
                                    completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
        [cluster
            unlockDoorWithParams:params
               completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id operatingModeArgument;
        operatingModeArgument = [NSNumber numberWithUnsignedChar:0U];
        [cluster writeAttributeOperatingModeWithValue:operatingModeArgument
                                    completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeUserCodeTemporaryDisableTimeWithCompletionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id wrongCodeEntryLimitArgument;
        wrongCodeEntryLimitArgument = [NSNumber numberWithUnsignedChar:3U];
        [cluster
            writeAttributeWrongCodeEntryLimitWithValue:wrongCodeEntryLimitArgument
                                     completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
               completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
               completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
               completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
               completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                    completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLockStateWithCompletionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
               completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLockStateWithCompletionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                    completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLockStateWithCompletionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLockStateWithCompletionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLockStateWithCompletionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:65534U];
        [cluster clearUserWithParams:params
                   completionHandler:^(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_FIELD));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 9:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 11:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 16:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 17:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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_FIELD));
            break;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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_FIELD));
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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_FIELD));
            break;
        case 52:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 53:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 54:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 55:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 56:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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_FIELD));
            break;
        case 60:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 61:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 62:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 63:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 64:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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_FIELD));
            break;
        case 68:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_FIELD));
            break;
        case 69:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeNumberOfTotalUsersSupportedWithCompletionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNumberOfWeekDaySchedulesSupportedPerUserWithCompletionHandler:^(
            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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNumberOfYearDaySchedulesSupportedPerUserWithCompletionHandler:^(
            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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNumberOfHolidaySchedulesSupportedWithCompletionHandler:^(
            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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                       completionHandler:^(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_FIELD));
                           NextTest();
                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleWithOutOfBoundsIndex_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                       completionHandler:^(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_FIELD));
                           NextTest();
                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleWith0UserIndex_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                       completionHandler:^(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_FIELD));
                           NextTest();
                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleWithOutOfBoundsUserIndex_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                       completionHandler:^(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_FIELD));
                           NextTest();
                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleForNonExistingUser_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                       completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                       completionHandler:^(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_FIELD));
                           NextTest();
                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleForSundayAndMonday_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                       completionHandler:^(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_FIELD));
                           NextTest();
                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleForSundayWednesdayAndSaturday_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                       completionHandler:^(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_FIELD));
                           NextTest();
                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleWithInvalidStartHour_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                       completionHandler:^(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_FIELD));
                           NextTest();
                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleWithInvalidStartMinute_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                       completionHandler:^(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_FIELD));
                           NextTest();
                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleWithInvalidEndHour_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                       completionHandler:^(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_FIELD));
                           NextTest();
                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleWithInvalidEndMinute_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                       completionHandler:^(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_FIELD));
                           NextTest();
                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleWithStartHourLaterThatEndHour_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                       completionHandler:^(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_FIELD));
                           NextTest();
                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateWeekDayScheduleWithStartMinuteLaterThatEndMinuteWhenHoursAreEqual_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                       completionHandler:^(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_FIELD));
                           NextTest();
                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatPreviousOperationsDidNotCreateASchedule_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                       completionHandler:^(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_FIELD));
                           NextTest();
                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateYearDayScheduleWithOutOfBoundsIndex_27()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                       completionHandler:^(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_FIELD));
                           NextTest();
                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateYearDayScheduleWith0UserIndex_28()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                       completionHandler:^(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_FIELD));
                           NextTest();
                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateYearDayScheduleWithOutOfBoundsUserIndex_29()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                       completionHandler:^(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_FIELD));
                           NextTest();
                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateYearDayScheduleForNonExistingUser_30()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                       completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                       completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                       completionHandler:^(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_FIELD));
                           NextTest();
                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateHolidayScheduleWithOutOfBoundsIndex_39()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                       completionHandler:^(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_FIELD));
                           NextTest();
                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateHolidayScheduleWithStartHourLaterThatEndHour_40()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                       completionHandler:^(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_FIELD));
                           NextTest();
                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCreateHolidayScheduleWithInvalidOperatingMode_41()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                       completionHandler:^(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_FIELD));
                           NextTest();
                       }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatPreviousOperationsDidNotCreateASchedule_42()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:1U];
        [cluster getHolidayScheduleWithParams:params
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:0U];
        [cluster getHolidayScheduleWithParams:params
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:1U];
        [cluster getHolidayScheduleWithParams:params
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                              completionHandler:^(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_FIELD));
                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearWeekDayScheduleWithOutOfBoundsIndex_52()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                              completionHandler:^(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_FIELD));
                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearWeekDayScheduleWith0UserIndex_53()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                              completionHandler:^(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_FIELD));
                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearWeekDayScheduleWithOutOfBoundsUserIndex_54()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                              completionHandler:^(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_FIELD));
                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearWeekDayScheduleWithNonExistingUser_55()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                              completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:1U];
        [cluster getHolidayScheduleWithParams:params
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                              completionHandler:^(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_FIELD));
                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearYearDayScheduleWithOutOfBoundsIndex_60()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                              completionHandler:^(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_FIELD));
                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearYearDayScheduleWith0UserIndex_61()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                              completionHandler:^(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_FIELD));
                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearYearDayScheduleWithOutOfBoundsUserIndex_62()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                              completionHandler:^(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_FIELD));
                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearYearDayScheduleWithNonExistingUser_63()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                              completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:1U];
        [cluster getHolidayScheduleWithParams:params
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:0U];
        [cluster clearHolidayScheduleWithParams:params
                              completionHandler:^(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_FIELD));
                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestClearHolidayScheduleWithOutOfBoundsIndex_68()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                              completionHandler:^(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_FIELD));
                                  NextTest();
                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestMakeSureThatWeekDayScheduleWasNotDeleted_69()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:1U];
        [cluster getHolidayScheduleWithParams:params
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:2U];
        [cluster getHolidayScheduleWithParams:params
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                              completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                              completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:1U];
        [cluster getHolidayScheduleWithParams:params
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:2U];
        [cluster getHolidayScheduleWithParams:params
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                              completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                              completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                              completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:65534U];
        [cluster clearUserWithParams:params
                   completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:1U];
        [cluster getHolidayScheduleWithParams:params
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:2U];
        [cluster getHolidayScheduleWithParams:params
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NumberOfHolidaySchedulesSupported copy];
        [cluster getHolidayScheduleWithParams:params
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:2U];
        [cluster clearHolidayScheduleWithParams:params
                              completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:1U];
        [cluster getHolidayScheduleWithParams:params
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:2U];
        [cluster getHolidayScheduleWithParams:params
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NumberOfHolidaySchedulesSupported copy];
        [cluster getHolidayScheduleWithParams:params
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:254U];
        [cluster clearHolidayScheduleWithParams:params
                              completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:1U];
        [cluster getHolidayScheduleWithParams:params
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NSNumber numberWithUnsignedChar:2U];
        [cluster getHolidayScheduleWithParams:params
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
        params.holidayIndex = [NumberOfHolidaySchedulesSupported copy];
        [cluster getHolidayScheduleWithParams:params
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:65534U];
        [cluster clearUserWithParams:params
                   completionHandler:^(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_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 True on the DUT\n");
            if (ShouldSkip("DRLK.S.A0033")) {
                NextTest();
                return;
            }
            err = TestThWritesTheRequirePINforRemoteOperationAttributeValueAsTrueOnTheDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool,
                " ***** Test Step 11 : TH writes the RequirePINforRemoteOperation attribute value as True on the DUT and Verify "
                "DUT responds with UNSUPPORTED_WRITE\n");
            if (ShouldSkip("!DRLK.S.A0033")) {
                NextTest();
                return;
            }
            err = TestThWritesTheRequirePINforRemoteOperationAttributeValueAsTrueOnTheDutAndVerifyDutRespondsWithUnsupportedWrite_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 writes WrongCodeEntryLimit attribute value as 3 on the DUT and Verify that the DUT sends "
                "Success response\n");
            if (ShouldSkip("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.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 send the Success response\n");
            if (ShouldSkip("DRLK.S.A0031")) {
                NextTest();
                return;
            }
            err = TestThWritesUserCodeTemporaryDisableTimeAttributeValueAs15SecondsOnTheDutAndVerifyThatTheDutSendTheSuccessResponse_18();
            break;
        case 19:
            ChipLogProgress(chipTool,
                " ***** Test Step 19 : TH writes UserCodeTemporaryDisableTime attribute value as 15 seconds on the DUT and Verify "
                "DUT responds with UNSUPPORTED_WRITE\n");
            if (ShouldSkip("!DRLK.S.A0031")) {
                NextTest();
                return;
            }
            err = TestThWritesUserCodeTemporaryDisableTimeAttributeValueAs15SecondsOnTheDutAndVerifyDutRespondsWithUnsupportedWrite_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : TH sends Lock Door Command to the DUT with invalid PINCode\n");
            if (ShouldSkip("DRLK.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsLockDoorCommandToTheDutWithInvalidPINCode_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : TH sends Lock Door Command to the DUT with invalid PINCode\n");
            if (ShouldSkip("DRLK.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsLockDoorCommandToTheDutWithInvalidPINCode_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : TH sends Lock Door Command to the DUT with invalid PINCode\n");
            if (ShouldSkip("DRLK.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsLockDoorCommandToTheDutWithInvalidPINCode_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : TH sends Lock Door Command to the DUT with invalid PINCode\n");
            if (ShouldSkip("DRLK.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsLockDoorCommandToTheDutWithInvalidPINCode_23();
            break;
        case 24:
            ChipLogProgress(chipTool,
                " ***** Test Step 24 : TH reads UserCodeTemporaryDisableTime attribute from DUT and After sending 3 failure "
                "responses verify that UserCodeTemporaryDisableTime attribute is triggered\n");
            if (ShouldSkip("PICS_USER_PROMPT && DRLK.S.A0031")) {
                NextTest();
                return;
            }
            err = TestThReadsUserCodeTemporaryDisableTimeAttributeFromDutAndAfterSending3FailureResponsesVerifyThatUserCodeTemporaryDisableTimeAttributeIsTriggered_24();
            break;
        case 25:
            ChipLogProgress(chipTool,
                " ***** Test Step 25 : TH sends Lock Command to the DUT with valid PINCode before UserCodeTemporaryDisableTime "
                "attribute time expires\n");
            if (ShouldSkip("PICS_USER_PROMPT && DRLK.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsLockCommandToTheDutWithValidPINCodeBeforeUserCodeTemporaryDisableTimeAttributeTimeExpires_25();
            break;
        case 26:
            ChipLogProgress(chipTool, " ***** Test Step 26 : Clean the created user\n");
            err = TestCleanTheCreatedUser_26();
            break;
        case 27:
            ChipLogProgress(chipTool, " ***** Test Step 27 : Cleanup the created credential\n");
            if (ShouldSkip("DRLK.S.C26.Rsp")) {
                NextTest();
                return;
            }
            err = TestCleanupTheCreatedCredential_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), 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), 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::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

    CHIP_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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                             completionHandler:^(
                                 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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id requirePINforRemoteOperationArgument;
        requirePINforRemoteOperationArgument = [NSNumber numberWithBool:false];
        [cluster writeAttributeRequirePINforRemoteOperationWithValue:requirePINforRemoteOperationArgument
                                                   completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id requirePINforRemoteOperationArgument;
        requirePINforRemoteOperationArgument = [NSNumber numberWithBool:false];
        [cluster writeAttributeRequirePINforRemoteOperationWithValue:requirePINforRemoteOperationArgument
                                                   completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeRequirePINforRemoteOperationWithCompletionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterLockDoorParams alloc] init];
        [cluster lockDoorWithParams:params
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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 TestThWritesTheRequirePINforRemoteOperationAttributeValueAsTrueOnTheDut_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id requirePINforRemoteOperationArgument;
        requirePINforRemoteOperationArgument = [NSNumber numberWithBool:true];
        [cluster writeAttributeRequirePINforRemoteOperationWithValue:requirePINforRemoteOperationArgument
                                                   completionHandler:^(NSError * _Nullable err) {
                                                       NSLog(@"TH writes the RequirePINforRemoteOperation attribute value as True "
                                                             @"on the DUT Error: %@",
                                                           err);

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

                                                       NextTest();
                                                   }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesTheRequirePINforRemoteOperationAttributeValueAsTrueOnTheDutAndVerifyDutRespondsWithUnsupportedWrite_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id requirePINforRemoteOperationArgument;
        requirePINforRemoteOperationArgument = [NSNumber numberWithBool:true];
        [cluster writeAttributeRequirePINforRemoteOperationWithValue:requirePINforRemoteOperationArgument
                                                   completionHandler:^(NSError * _Nullable err) {
                                                       NSLog(@"TH writes the RequirePINforRemoteOperation attribute value as True "
                                                             @"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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster
            readAttributeRequirePINforRemoteOperationWithCompletionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterLockDoorParams alloc] init];
        [cluster lockDoorWithParams:params
                  completionHandler:^(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 TestThWritesWrongCodeEntryLimitAttributeValueAs3OnTheDutAndVerifyThatTheDutSendsSuccessResponse_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id wrongCodeEntryLimitArgument;
        wrongCodeEntryLimitArgument = [NSNumber numberWithUnsignedChar:3U];
        [cluster writeAttributeWrongCodeEntryLimitWithValue:wrongCodeEntryLimitArgument
                                          completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id wrongCodeEntryLimitArgument;
        wrongCodeEntryLimitArgument = [NSNumber numberWithUnsignedChar:3U];
        [cluster writeAttributeWrongCodeEntryLimitWithValue:wrongCodeEntryLimitArgument
                                          completionHandler:^(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
    TestThWritesUserCodeTemporaryDisableTimeAttributeValueAs15SecondsOnTheDutAndVerifyThatTheDutSendTheSuccessResponse_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id userCodeTemporaryDisableTimeArgument;
        userCodeTemporaryDisableTimeArgument = [NSNumber numberWithUnsignedChar:15U];
        [cluster
            writeAttributeUserCodeTemporaryDisableTimeWithValue:userCodeTemporaryDisableTimeArgument
                                              completionHandler:^(NSError * _Nullable err) {
                                                  NSLog(@"TH writes UserCodeTemporaryDisableTime attribute value as 15 seconds on "
                                                        @"the DUT and Verify that the DUT send the Success response Error: %@",
                                                      err);

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

                                                  NextTest();
                                              }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestThWritesUserCodeTemporaryDisableTimeAttributeValueAs15SecondsOnTheDutAndVerifyDutRespondsWithUnsupportedWrite_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id userCodeTemporaryDisableTimeArgument;
        userCodeTemporaryDisableTimeArgument = [NSNumber numberWithUnsignedChar:15U];
        [cluster
            writeAttributeUserCodeTemporaryDisableTimeWithValue:userCodeTemporaryDisableTimeArgument
                                              completionHandler:^(NSError * _Nullable err) {
                                                  NSLog(@"TH writes UserCodeTemporaryDisableTime attribute value as 15 seconds 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 TestThSendsLockDoorCommandToTheDutWithInvalidPINCode_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterLockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"123458" length:6];
        [cluster lockDoorWithParams:params
                  completionHandler:^(NSError * _Nullable err) {
                      NSLog(@"TH sends Lock 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 TestThSendsLockDoorCommandToTheDutWithInvalidPINCode_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterLockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"123458" length:6];
        [cluster lockDoorWithParams:params
                  completionHandler:^(NSError * _Nullable err) {
                      NSLog(@"TH sends Lock 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 TestThSendsLockDoorCommandToTheDutWithInvalidPINCode_22()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterLockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"123458" length:6];
        [cluster lockDoorWithParams:params
                  completionHandler:^(NSError * _Nullable err) {
                      NSLog(@"TH sends Lock 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 TestThSendsLockDoorCommandToTheDutWithInvalidPINCode_23()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterLockDoorParams alloc] init];
        params.pinCode = [[NSData alloc] initWithBytes:"123458" length:6];
        [cluster lockDoorWithParams:params
                  completionHandler:^(NSError * _Nullable err) {
                      NSLog(@"TH sends Lock 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
    TestThReadsUserCodeTemporaryDisableTimeAttributeFromDutAndAfterSending3FailureResponsesVerifyThatUserCodeTemporaryDisableTimeAttributeIsTriggered_24()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not 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 TestThSendsLockCommandToTheDutWithValidPINCodeBeforeUserCodeTemporaryDisableTimeAttributeTimeExpires_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 TestCleanTheCreatedUser_26()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster clearUserWithParams:params
                   completionHandler:^(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_27()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                         completionHandler:^(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 : Precondition: Door is in locked state\n");
            if (ShouldSkip("DRLK.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestPreconditionDoorIsInLockedState_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : TH writes AutoRelockTime attribute value as 10 seconds on the DUT\n");
            if (ShouldSkip("DRLK.S.A0023")) {
                NextTest();
                return;
            }
            err = TestThWritesAutoRelockTimeAttributeValueAs10SecondsOnTheDut_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH sends the unlock Door command to the DUT with valid PINCode\n");
            if (ShouldSkip("DRLK.S.C01.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsTheUnlockDoorCommandToTheDutWithValidPINCode_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Wait 10000ms\n");
            err = TestWait10000ms_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : TH reads LockState attribute\n");
            if (ShouldSkip("DRLK.S.A0000")) {
                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), 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 TestCreateNewUser_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                             completionHandler:^(
                                 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 TestPreconditionDoorIsInLockedState_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(NSError * _Nullable err) {
                      NSLog(@"Precondition: Door is in locked state Error: %@", err);

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

                      NextTest();
                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesAutoRelockTimeAttributeValueAs10SecondsOnTheDut_6()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id autoRelockTimeArgument;
        autoRelockTimeArgument = [NSNumber numberWithUnsignedInt:60UL];
        [cluster writeAttributeAutoRelockTimeWithValue:autoRelockTimeArgument
                                     completionHandler:^(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 TestThSendsTheUnlockDoorCommandToTheDutWithValidPINCode_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                    completionHandler:^(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 TestWait10000ms_8()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 10000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsLockStateAttribute_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLockStateWithCompletionHandler:^(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, 2U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestCleanupTheCreatedUser_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster clearUserWithParams:params
                   completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                         completionHandler:^(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 PIN credential and lock/unlock user\n");
            if (ShouldSkip("DRLK.S.C22.Rsp")) {
                NextTest();
                return;
            }
            err = TestCreateNewPinCredentialAndLockUnlockUser_1();
            break;
        case 2:
            ChipLogProgress(chipTool, " ***** Test Step 2 : Precondition: Door is in locked state\n");
            if (ShouldSkip("DRLK.S.C00.Rsp")) {
                NextTest();
                return;
            }
            err = TestPreconditionDoorIsInLockedState_2();
            break;
        case 3:
            ChipLogProgress(chipTool, " ***** Test Step 3 : TH writes AutoRelockTime attribute value as 10 seconds on the DUT\n");
            if (ShouldSkip("DRLK.S.A0023")) {
                NextTest();
                return;
            }
            err = TestThWritesAutoRelockTimeAttributeValueAs10SecondsOnTheDut_3();
            break;
        case 4:
            ChipLogProgress(chipTool, " ***** Test Step 4 : TH sends the unlock with Timeout command to the DUT \n");
            if (ShouldSkip("DRLK.S.C03.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsTheUnlockWithTimeoutCommandToTheDut_4();
            break;
        case 5:
            ChipLogProgress(chipTool, " ***** Test Step 5 : TH reads AutoRelockTime attribute from DUT\n");
            if (ShouldSkip("DRLK.S.A0023")) {
                NextTest();
                return;
            }
            err = TestThReadsAutoRelockTimeAttributeFromDut_5();
            break;
        case 6:
            ChipLogProgress(chipTool, " ***** Test Step 6 : Wait 5000ms\n");
            err = TestWait5000ms_6();
            break;
        case 7:
            ChipLogProgress(chipTool, " ***** Test Step 7 : TH reads LockState attribute\n");
            if (ShouldSkip("DRLK.S.A0000")) {
                NextTest();
                return;
            }
            err = TestThReadsLockStateAttribute_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 TestCreateNewPinCredentialAndLockUnlockUser_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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 TestPreconditionDoorIsInLockedState_2()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(NSError * _Nullable err) {
                      NSLog(@"Precondition: Door is in locked state Error: %@", err);

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

                      NextTest();
                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThWritesAutoRelockTimeAttributeValueAs10SecondsOnTheDut_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id autoRelockTimeArgument;
        autoRelockTimeArgument = [NSNumber numberWithUnsignedInt:10UL];
        [cluster writeAttributeAutoRelockTimeWithValue:autoRelockTimeArgument
                                     completionHandler:^(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 TestThSendsTheUnlockWithTimeoutCommandToTheDut_4()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterUnlockWithTimeoutParams alloc] init];
        params.timeout = [NSNumber numberWithUnsignedShort:5U];
        params.pinCode = [[NSData alloc] initWithBytes:"123456" length:6];
        [cluster unlockWithTimeoutWithParams:params
                           completionHandler:^(NSError * _Nullable err) {
                               NSLog(@"TH sends the unlock with Timeout command to the DUT  Error: %@", err);

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

                               NextTest();
                           }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestThReadsAutoRelockTimeAttributeFromDut_5()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeAutoRelockTimeWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"TH reads AutoRelockTime attribute from 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 TestWait5000ms_6()
    {
        chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
        value.ms = 5000UL;
        return WaitForMs("alpha", value);
    }

    CHIP_ERROR TestThReadsLockStateAttribute_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeLockStateWithCompletionHandler:^(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;
    }
};

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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNumberOfWeekDaySchedulesSupportedPerUserWithCompletionHandler:^(
            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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNumberOfTotalUsersSupportedWithCompletionHandler:^(
            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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                       completionHandler:^(
                           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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                       completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                              completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster clearUserWithParams:params
                   completionHandler:^(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.F04 && 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.C.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.F04 && 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.F04 && 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.F04 && 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.F04 && 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.F04 && 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.F04 && 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.F04 && 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.F04 && 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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNumberOfYearDaySchedulesSupportedPerUserWithCompletionHandler:^(
            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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNumberOfTotalUsersSupportedWithCompletionHandler:^(
            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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                       completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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:21U];
        [cluster getYearDayScheduleWithParams:params
                            completionHandler:^(
                                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, 2U));
                                }

                                {
                                    id actualValue = values.userIndex;
                                    VerifyOrReturn(CheckValue("userIndex", actualValue, 21U));
                                }

                                {
                                    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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
        params.yearDayIndex = [NSNumber numberWithUnsignedChar:10U];
        params.userIndex = [NSNumber numberWithUnsignedShort:5U];
        [cluster getYearDayScheduleWithParams:params
                            completionHandler:^(
                                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, 10U));
                                }

                                {
                                    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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                              completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                              completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                              completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster clearUserWithParams:params
                   completionHandler:^(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.C.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\n");
            if (ShouldSkip("DRLK.S.F08 && DRLK.S.C22.Rsp && DRLK.S.C23.Tx")) {
                NextTest();
                return;
            }
            err = TestThSendsSetCredentialCommandToDut_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\n");
            if (ShouldSkip("DRLK.S.F08 && DRLK.S.C22.Rsp && DRLK.S.C23.Tx")) {
                NextTest();
                return;
            }
            err = TestThSendsSetCredentialCommandToDut_10();
            break;
        case 11:
            ChipLogProgress(chipTool,
                " ***** Test Step 11 : TH sends Set Credential Command to DUT and Verify that the DUT sends Set Credential "
                "Response command with response as OCCUPIED if the CredentialIndex is repeated\n");
            if (ShouldSkip("PICS_USER_PROMPT && DRLK.S.F08 && DRLK.S.C22.Rsp && DRLK.S.C23.Tx")) {
                NextTest();
                return;
            }
            err = TestThSendsSetCredentialCommandToDutAndVerifyThatTheDutSendsSetCredentialResponseCommandWithResponseAsOccupiedIfTheCredentialIndexIsRepeated_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : 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_12();
            break;
        case 13:
            ChipLogProgress(chipTool,
                " ***** Test Step 13 : TH sends Set Credential Command to DUT and Verify that the DUT sends Set Credential "
                "Response command with response as OCCUPIED if the CredentialIndex is repeated\n");
            if (ShouldSkip("PICS_USER_PROMPT && DRLK.S.F08 && DRLK.S.C22.Rsp && DRLK.S.C23.Tx")) {
                NextTest();
                return;
            }
            err = TestThSendsSetCredentialCommandToDutAndVerifyThatTheDutSendsSetCredentialResponseCommandWithResponseAsOccupiedIfTheCredentialIndexIsRepeated_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : TH sends Clear Credential Command to DUT\n");
            if (ShouldSkip("DRLK.S.F08 && DRLK.S.C26.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsClearCredentialCommandToDut_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : 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_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : TH sends Set User Command to DUT\n");
            err = TestThSendsSetUserCommandToDut_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : 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_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 : TH sends Get Credential Status Command\n");
            if (ShouldSkip("DRLK.S.F08 && DRLK.S.C24.Rsp && DRLK.S.C25.Tx")) {
                NextTest();
                return;
            }
            err = TestThSendsGetCredentialStatusCommand_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : TH sends Get Credential Status Command\n");
            if (ShouldSkip("DRLK.S.F08 && DRLK.S.C24.Rsp && DRLK.S.C25.Tx")) {
                NextTest();
                return;
            }
            err = TestThSendsGetCredentialStatusCommand_20();
            break;
        case 21:
            ChipLogProgress(chipTool, " ***** Test Step 21 : TH sends Clear Credential Command to DUT\n");
            if (ShouldSkip("DRLK.S.F08 && DRLK.S.C26.Rsp")) {
                NextTest();
                return;
            }
            err = TestThSendsClearCredentialCommandToDut_21();
            break;
        case 22:
            ChipLogProgress(chipTool, " ***** Test Step 22 : Cleanup the first created user\n");
            err = TestCleanupTheFirstCreatedUser_22();
            break;
        case 23:
            ChipLogProgress(chipTool, " ***** Test Step 23 : Cleanup the second created user\n");
            err = TestCleanupTheSecondCreatedUser_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), EMBER_ZCL_STATUS_INVALID_COMMAND));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 23:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        }

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

    chip::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 TestCreateNewUserWithDefaultParameters_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster getUserWithParams:params
                 completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeNumberOfTotalUsersSupportedWithCompletionHandler:^(
            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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                             completionHandler:^(
                                 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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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 = [NSNumber numberWithUnsignedShort:2U];
        params.userStatus = [NSNumber numberWithUnsignedChar:5U];
        params.userType = [NSNumber numberWithUnsignedChar:10U];
        [cluster
            setCredentialWithParams:params
                  completionHandler:^(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");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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 = [NSNumber numberWithUnsignedShort:2U];
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                  completionHandler:^(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 TestThSendsSetCredentialCommandToDut_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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, 2U));
                      }

                      NextTest();
                  }];

        return CHIP_NO_ERROR;
    }

    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 TestThSendsSetCredentialCommandToDut_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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:3U];
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                  completionHandler:^(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, 4U));
                      }

                      NextTest();
                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestThSendsSetCredentialCommandToDutAndVerifyThatTheDutSendsSetCredentialResponseCommandWithResponseAsOccupiedIfTheCredentialIndexIsRepeated_11()
    {
        chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
        value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not 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 TestThSendsSetCredentialCommandToDut_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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:3U];

        params.credentialData = [[NSData alloc] initWithBytes:"123456" length:6];
        params.userIndex = [NSNumber numberWithUnsignedShort:2U];
        params.userStatus = nil;
        params.userType = nil;
        [cluster
            setCredentialWithParams:params
                  completionHandler:^(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, 4U));
                      }

                      NextTest();
                  }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR
    TestThSendsSetCredentialCommandToDutAndVerifyThatTheDutSendsSetCredentialResponseCommandWithResponseAsOccupiedIfTheCredentialIndexIsRepeated_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 TestThSendsClearCredentialCommandToDut_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                         completionHandler:^(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_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                             completionHandler:^(
                                 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_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                 completionHandler:^(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_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                         completionHandler:^(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_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                             completionHandler:^(
                                 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_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                             completionHandler:^(
                                 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_21()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint: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
                    completionHandler:^(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_22()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:1U];
        [cluster clearUserWithParams:params
                   completionHandler:^(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_23()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
        params.userIndex = [NSNumber numberWithUnsignedShort:2U];
        [cluster clearUserWithParams:params
                   completionHandler:^(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");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
        params.groupId = [NSNumber numberWithUnsignedShort:0U];
        [cluster viewGroupWithParams:params
                   completionHandler:^(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");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
        params.groupId = [NSNumber numberWithUnsignedShort:257U];
        [cluster viewGroupWithParams:params
                   completionHandler:^(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");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                                                     endpoint: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
                     completionHandler:^(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");
        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                                                     endpoint: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
                                  completionHandler:^(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");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
        params.groupId = [NSNumber numberWithUnsignedShort:257U];
        [cluster viewGroupWithParams:params
                   completionHandler:^(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");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
        params.groupId = [NSNumber numberWithUnsignedShort:258U];
        [cluster viewGroupWithParams:params
                   completionHandler:^(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");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
        params.groupId = [NSNumber numberWithUnsignedShort:258U];
        [cluster viewGroupWithParams:params
                   completionHandler:^(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");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
        params.groupId = [NSNumber numberWithUnsignedShort:32767U];
        [cluster viewGroupWithParams:params
                   completionHandler:^(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");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
        params.groupId = [NSNumber numberWithUnsignedShort:257U];
        [cluster viewGroupWithParams:params
                   completionHandler:^(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");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
        params.groupId = [NSNumber numberWithUnsignedShort:258U];
        [cluster viewGroupWithParams:params
                   completionHandler:^(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");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterRemoveGroupParams alloc] init];
        params.groupId = [NSNumber numberWithUnsignedShort:0U];
        [cluster removeGroupWithParams:params
                     completionHandler:^(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");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterRemoveGroupParams alloc] init];
        params.groupId = [NSNumber numberWithUnsignedShort:260U];
        [cluster removeGroupWithParams:params
                     completionHandler:^(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");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterRemoveGroupParams alloc] init];
        params.groupId = [NSNumber numberWithUnsignedShort:258U];
        [cluster removeGroupWithParams:params
                     completionHandler:^(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");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
        params.groupId = [NSNumber numberWithUnsignedShort:257U];
        [cluster viewGroupWithParams:params
                   completionHandler:^(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");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
        params.groupId = [NSNumber numberWithUnsignedShort:258U];
        [cluster viewGroupWithParams:params
                   completionHandler:^(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");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster removeAllGroupsWithCompletionHandler:^(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");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
        params.groupId = [NSNumber numberWithUnsignedShort:257U];
        [cluster viewGroupWithParams:params
                   completionHandler:^(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");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
        params.groupId = [NSNumber numberWithUnsignedShort:258U];
        [cluster viewGroupWithParams:params
                   completionHandler:^(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");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
        params.groupId = [NSNumber numberWithUnsignedShort:32767U];
        [cluster viewGroupWithParams:params
                   completionHandler:^(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");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpoint: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
                            completionHandler:^(
                                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\n");
            err = TestWriteGroupKeys_7();
            break;
        case 8:
            ChipLogProgress(chipTool, " ***** Test Step 8 : Read Group Keys\n");
            err = TestReadGroupKeys_8();
            break;
        case 9:
            ChipLogProgress(chipTool, " ***** Test Step 9 : Add Group 1\n");
            err = TestAddGroup1_9();
            break;
        case 10:
            ChipLogProgress(chipTool, " ***** Test Step 10 : Add Group 2\n");
            err = TestAddGroup2_10();
            break;
        case 11:
            ChipLogProgress(chipTool, " ***** Test Step 11 : Read GroupTable\n");
            err = TestReadGroupTable_11();
            break;
        case 12:
            ChipLogProgress(chipTool, " ***** Test Step 12 : KeySet Remove 1\n");
            err = TestKeySetRemove1_12();
            break;
        case 13:
            ChipLogProgress(chipTool, " ***** Test Step 13 : KeySet Read (removed)\n");
            err = TestKeySetReadRemoved_13();
            break;
        case 14:
            ChipLogProgress(chipTool, " ***** Test Step 14 : KeySet Read (not removed)\n");
            err = TestKeySetReadNotRemoved_14();
            break;
        case 15:
            ChipLogProgress(chipTool, " ***** Test Step 15 : Remove Group 1\n");
            err = TestRemoveGroup1_15();
            break;
        case 16:
            ChipLogProgress(chipTool, " ***** Test Step 16 : Read GroupTable 2\n");
            err = TestReadGroupTable2_16();
            break;
        case 17:
            ChipLogProgress(chipTool, " ***** Test Step 17 : Remove All\n");
            err = TestRemoveAll_17();
            break;
        case 18:
            ChipLogProgress(chipTool, " ***** Test Step 18 : Read GroupTable 3\n");
            err = TestReadGroupTable3_18();
            break;
        case 19:
            ChipLogProgress(chipTool, " ***** Test Step 19 : KeySet Remove 2\n");
            err = TestKeySetRemove2_19();
            break;
        case 20:
            ChipLogProgress(chipTool, " ***** Test Step 20 : KeySet Read (also removed)\n");
            err = TestKeySetReadAlsoRemoved_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), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 7:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 8:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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_NOT_FOUND));
            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), 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 = 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 TestReadMaxGroupsPerFabric_1()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                                                     endpoint:0
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxGroupsPerFabricWithCompletionHandler:^(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");
        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                                                     endpoint:0
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster readAttributeMaxGroupKeysPerFabricWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable err) {
            NSLog(@"Read maxGroupKeysPerFabric Error: %@", err);

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

            {
                id actualValue = value;
                VerifyOrReturn(CheckValue("MaxGroupKeysPerFabric", actualValue, 2U));
            }

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestKeySetWrite1_3()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                                                     endpoint: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
                     completionHandler:^(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");
        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                                                     endpoint: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
                     completionHandler:^(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");
        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                                                     endpoint:0
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupKeyManagementClusterKeySetReadParams alloc] init];
        params.groupKeySetID = [NSNumber numberWithUnsignedShort:417U];
        [cluster
            keySetReadWithParams:params
               completionHandler:^(
                   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");
        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                                                     endpoint: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
                                  completionHandler:^(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 TestWriteGroupKeys_7()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                                                     endpoint:0
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        id groupKeyMapArgument;
        {
            NSMutableArray * temp_0 = [[NSMutableArray alloc] init];
            temp_0[0] = [[MTRGroupKeyManagementClusterGroupKeyMapStruct alloc] init];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[0]).groupId = [NSNumber numberWithUnsignedShort:257U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[0]).groupKeySetID = [NSNumber numberWithUnsignedShort:417U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[0]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            temp_0[1] = [[MTRGroupKeyManagementClusterGroupKeyMapStruct alloc] init];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[1]).groupId = [NSNumber numberWithUnsignedShort:258U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[1]).groupKeySetID = [NSNumber numberWithUnsignedShort:418U];
            ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) temp_0[1]).fabricIndex = [NSNumber numberWithUnsignedChar:1U];

            groupKeyMapArgument = temp_0;
        }
        [cluster writeAttributeGroupKeyMapWithValue:groupKeyMapArgument
                                  completionHandler:^(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_8()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                                                     endpoint:0
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        MTRReadParams * params = [[MTRReadParams alloc] init];
        params.fabricFiltered = [NSNumber numberWithBool:true];
        [cluster
            readAttributeGroupKeyMapWithParams:params
                             completionHandler:^(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>(2)));
                                     VerifyOrReturn(CheckValue("GroupId",
                                         ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) actualValue[0]).groupId, 257U));
                                     VerifyOrReturn(CheckValue("GroupKeySetID",
                                         ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) actualValue[0]).groupKeySetID, 417U));
                                     VerifyOrReturn(CheckValue("FabricIndex",
                                         ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) actualValue[0]).fabricIndex, 1U));
                                     VerifyOrReturn(CheckValue("GroupId",
                                         ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) actualValue[1]).groupId, 258U));
                                     VerifyOrReturn(CheckValue("GroupKeySetID",
                                         ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) actualValue[1]).groupKeySetID, 418U));
                                     VerifyOrReturn(CheckValue("FabricIndex",
                                         ((MTRGroupKeyManagementClusterGroupKeyMapStruct *) actualValue[1]).fabricIndex, 1U));
                                 }

                                 NextTest();
                             }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestAddGroup1_9()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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_10()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpoint: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
                  completionHandler:^(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_11()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                                                     endpoint:0
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        MTRReadParams * params = [[MTRReadParams alloc] init];
        params.fabricFiltered = [NSNumber numberWithBool:true];
        [cluster readAttributeGroupTableWithParams:params
                                 completionHandler:^(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_12()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                                                     endpoint:0
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupKeyManagementClusterKeySetRemoveParams alloc] init];
        params.groupKeySetID = [NSNumber numberWithUnsignedShort:417U];
        [cluster keySetRemoveWithParams:params
                      completionHandler:^(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_13()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                                                     endpoint:0
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupKeyManagementClusterKeySetReadParams alloc] init];
        params.groupKeySetID = [NSNumber numberWithUnsignedShort:417U];
        [cluster
            keySetReadWithParams:params
               completionHandler:^(
                   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_14()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                                                     endpoint:0
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupKeyManagementClusterKeySetReadParams alloc] init];
        params.groupKeySetID = [NSNumber numberWithUnsignedShort:418U];
        [cluster
            keySetReadWithParams:params
               completionHandler:^(
                   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_15()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupsClusterRemoveGroupParams alloc] init];
        params.groupId = [NSNumber numberWithUnsignedShort:257U];
        [cluster removeGroupWithParams:params
                     completionHandler:^(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_16()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                                                     endpoint:0
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        MTRReadParams * params = [[MTRReadParams alloc] init];
        params.fabricFiltered = [NSNumber numberWithBool:true];
        [cluster readAttributeGroupTableWithParams:params
                                 completionHandler:^(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_17()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpoint:1 queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        [cluster removeAllGroupsWithCompletionHandler:^(NSError * _Nullable err) {
            NSLog(@"Remove All Error: %@", err);

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

            NextTest();
        }];

        return CHIP_NO_ERROR;
    }

    CHIP_ERROR TestReadGroupTable3_18()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                                                     endpoint:0
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        MTRReadParams * params = [[MTRReadParams alloc] init];
        params.fabricFiltered = [NSNumber numberWithBool:true];
        [cluster readAttributeGroupTableWithParams:params
                                 completionHandler:^(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_19()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                                                     endpoint:0
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupKeyManagementClusterKeySetRemoveParams alloc] init];
        params.groupKeySetID = [NSNumber numberWithUnsignedShort:418U];
        [cluster keySetRemoveWithParams:params
                      completionHandler:^(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_20()
    {
        MTRBaseDevice * device = GetDevice("alpha");
        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
                                                                                                     endpoint:0
                                                                                                        queue:mCallbackQueue];
        VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);

        __auto_type * params = [[MTRGroupKeyManagementClusterKeySetReadParams alloc] init];
        params.groupKeySetID = [NSNumber numberWithUnsignedShort:418U];
        [cluster
            keySetReadWithParams:params
               completionHandler:^(
                   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;
    }
};

#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_BOOL_1_1>(),
        make_unique<Test_TC_BOOL_2_1>(),
        make_unique<Test_TC_ACT_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_6_2>(),
        make_unique<Test_TC_CC_6_3>(),
        make_unique<Test_TC_CC_7_3>(),
        make_unique<Test_TC_CC_7_4>(),
        make_unique<Test_TC_CC_8_1>(),
        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_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_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_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_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_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_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_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_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_TSTAT_2_1>(),
        make_unique<Test_TC_TSTAT_2_2>(),
        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_ULABEL_1_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_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_2_1>(),
        make_unique<Test_TC_DGSW_2_2>(),
        make_unique<Test_TC_DGSW_2_3>(),
        make_unique<TestSubscribe_OnOff>(),
        make_unique<DL_UsersAndCredentials>(),
        make_unique<DL_LockUnlock>(),
        make_unique<DL_Schedules>(),
        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_7>(),
        make_unique<Test_TC_DRLK_2_9>(),
        make_unique<TestGroupsCluster>(),
        make_unique<TestGroupKeyManagementCluster>(),
#endif // CONFIG_ENABLE_YAML_TESTS
    };

    commands.Register(clusterName, clusterCommands);
}
